Django: фильтрация по% filter% запрещена - PullRequest
17 голосов
/ 22 июня 2011

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

SuspiciousOperation at
/hometeam/admin/players/playeryear/

Filtering by team__season__season_start_date__year not allowed

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

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

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

Ответы [ 2 ]

27 голосов
/ 24 июня 2011

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

Временное решение для этой версиизаключается в том, чтобы определить 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)
2 голосов
/ 22 июня 2011

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

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

...