Подтвердить что ты не робот

Django: фильтрация по фильтру% не разрешена

Я унаследовал приложение Django v1.2.4 и в процессе добавления нескольких исправлений и улучшений. Во время этого процесса я вдруг начал сталкиваться со следующей ошибкой:

SuspiciousOperation at
/hometeam/admin/players/playeryear/

Filtering by team__season__season_start_date__year not allowed

Эта ошибка отображается во всплывающих окнах интерфейса администратора, когда я пытаюсь выбрать элемент для поля ввода (доступ через увеличительное стекло, связанное с полями).

У меня включена отладка, но я не могу определить, где происходит эта ошибка или какое недавнее изменение заставило ее начать. Можете ли вы помочь мне правильно разобрать вывод отладки для отслеживания ошибочного фильтра, который вызывает эту проблему?

player/admin.py содержит следующий класс:

class PlayerYearAdmin(FkAutocompleteAdmin):
    related_search_fields = {
        'team': ('school__school',),
        'player': ('first_name', 'last_name'),
    }
    list_display = ['player', 'team', 'player_year_in_school']
    list_filter = ['team']
    search_fields = ['player__first_name', 'player__last_name']
    ordering = ['player__last_name', 'player__first_name']

Замечание операторов list_display и list_filter не изменяет проблему.

Ниже приведен фрагмент отладочного вывода. Я могу опубликовать больше по мере необходимости.

Request Method: GET

Request URL:    http://204.232.208.57:8010/hometeam/admin/players/playeryear/?team__season__season_start_date__year=2010&team__sport__sport=Boys%20Basketball&t=id&pop=1

Django Version: 1.2.4

Exception Type: SuspiciousOperation

Exception Value:    Filtering by team__season__season_start_date__year not allowed

Exception Location: /usr/local/lib/python2.6/dist-packages/Django-1.2.4-py2.6.egg/django/contrib/admin/views/main.py in get_query_set, line 193

Python Executable:  /usr/bin/python

Я уже применил исправление, предложенное в https://code.djangoproject.com/changeset/15140, но после патча никаких изменений не было. Любые рекомендации будут оценены.

4b9b3361

Ответ 1

Эта проблема была решена в соответствии с инструкциями, представленными в блоге Криса Адамса. Django 1.2.4 представил новую функцию безопасности, которая ограничивала возможность использования "произвольных кросс-модельных запросов через querystring", как отметил Даниэль Роземан в ответ .

Обходной путь для этой версии заключается в определении метода lookup_allowed в FooAdmin ('PlayerYearAdmin' в моем случае), который возвращает true для всех фильтров, которые вы хотите включить. В моем случае lookup_allowed выглядел следующим образом:

def lookup_allowed(self, key):
    if key in ('team__season__season_start_date__year', 'team__sport'):
        return True
    return super(PlayerYearAdmin, self).lookup_allowed(key)

Вы также можете обойти проверку безопасности, фактически заявив, что все запросы разрешены. Это было поведение по умолчанию до версии 1.2.4:

def lookup_allowed(self, key):
    return True

Возможно, стоит отметить, что версия 1.2.5 добавила третий параметр, значение, в lookup_allowed. Если вы используете эту версию, вы можете определить lookup_allowed следующим образом:

def lookup_allowed(self, key, value):
    if key in ('team__season__season_start_date__year', 'team__sport'):
        return True
    return super(PlayerYearAdmin, self).lookup_allowed(key, value)

Ответ 2

В качестве примечания к выпуску для версии 1.2.4 произвольные кросс-модельные запросы через querystring больше не разрешены, так как они представляют собой угрозу безопасности, Этот патч не предназначен для их повторного включения.

Необходимо указать разрешенные отношения явно в свойстве admin list_filter. К сожалению, это было возможно только с версии 1.3, поэтому вам нужно будет обновить.