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

Я унаследовал приложение 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. , но после патча изменений не было. Любое руководство будет оценено.


person George Cummins    schedule 22.06.2011    source источник


Ответы (2)


Эта проблема была решена в соответствии с инструкциями, приведенными на странице Chris. Блог Адамса. Django 1.2.4 представила новую функцию безопасности, которая ограничивала возможность использования «произвольного поиска между моделями с помощью строки запроса», как отметил Дэниел Роузман в своем ответить.

Обходной путь для этой версии — определить метод 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 добавлен третий параметр, value, до 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)
person George Cummins    schedule 24.06.2011

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

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

person Daniel Roseman    schedule 22.06.2011
comment
Я бы предпочел найти ошибочный фильтр вместо обновления. Есть ли у вас какие-либо предложения относительно того, как этого добиться? - person George Cummins; 22.06.2011
comment
Скорее всего, вы найдете это в пользовательском шаблоне администратора. - person Chris Pratt; 22.06.2011
comment
@chrisdpratt: Хорошая идея, но в данном случае я не использую настраиваемые шаблоны администратора. - person George Cummins; 22.06.2011
comment
Хорошо, как вам добраться до этого URL-адреса? Проблема заключается в строке запроса URL-адреса, упомянутого в трассировке, как указал @Daniel. Исправление состоит в том, чтобы удалить оскорбительный бит из строки запроса. - person Chris Pratt; 22.06.2011
comment
@chrisdpratt: я получаю доступ к этому всплывающему окну через интерактивную ссылку рядом с полем ввода. После небольшого расследования я определил, что ссылка генерируется встроенным модулем автозаполнения, который мы используем. Я изучу этот модуль, чтобы увидеть, как собирается URL-адрес. - person George Cummins; 22.06.2011
comment
@Daniel Roseman: Спасибо за вашу хорошую помощь. Я смог наткнуться на ответ, который хорошо подходил для моей ситуации и не требовал обновления. Пожалуйста, смотрите опубликованный ответ для деталей. - person George Cummins; 24.06.2011