2011-06-22 11 views
16

Odziedziczyłem aplikację Django v1.2.4 i jestem w trakcie dodawania kilku poprawek i ulepszeń. Podczas tego procesu, nagle zaczęły się pojawić następujący błąd:Django: Filtrowanie według% filtra% niedozwolone

SuspiciousOperation at 
/hometeam/admin/players/playeryear/ 

Filtering by team__season__season_start_date__year not allowed 

Ten błąd jest wyświetlany w wyskakujących okienek interfejsu administratora, gdy próbuję wybrać pozycję na polu wprowadzania (dostępnego przez lupę związanego z polami).

Mam włączone debugowanie, ale nie jestem w stanie określić, gdzie wystąpił ten błąd lub która ostatnia zmiana spowodowała jego uruchomienie. Czy możesz pomóc mi poprawnie przeanalizować wyniki debugowania, aby wykryć błędny filtr, który powoduje ten problem?

gracze/admin.py zawiera następujące klasy:

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'] 

zakomentowanie oświadczenia list_display i list_filter nie zmienia problemu.

Poniżej znajduje się kilka wyników debugowania. W razie potrzeby mogę opublikować więcej.

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 

już zastosowane poprawki sugerowane w https://code.djangoproject.com/changeset/15140, ale nie było zmiany po plastra. Wszelkie wskazówki zostaną docenione.

Odpowiedz

25

Ten problem został rozwiązany zgodnie z instrukcjami podanymi pod numerem Chris Adams' blog. Django 1.2.4 wprowadził nową funkcję bezpieczeństwa, która ograniczyła możliwość korzystania z "arbitralnych przeglądów wielu modeli za pomocą kwerendy", jak zauważył Daniel Roseman w swoim answer.

Rozwiązaniem dla tej wersji jest określenie sposobu lookup_allowed w FooAdmin („PlayerYearAdmin” w moim przypadku), która zwraca wartość true dla wszystkich filtrów, które chcesz włączyć. W moim przypadku, lookup_allowed wyglądał następująco:

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) 

Można też ominąć kontrolę bezpieczeństwa w ogóle, skutecznie stwierdzające, że wszystkie wyszukiwań są dozwolone. Było to domyślne zachowanie przed wersją 1.2.4:

def lookup_allowed(self, key): 
    return True 

Warto może zauważyć, że wersja 1.2.5 added a third parameter, wartość, aby lookup_allowed. Jeśli używasz tej wersji, możesz zdefiniować lookup_allowed w ten sposób:

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) 
+3

Świetne znalezisko. Dzięki. – Cerin

1

Stan, w którym znajduje się release notes for 1.2.4, arbitralne wyszukiwanie krzyżowe za pośrednictwem kwerendy nie jest już dozwolone, ponieważ stanowią one zagrożenie dla bezpieczeństwa. Ta poprawka nie ma na celu ponownego ich włączenia.

Musisz jawnie określić dozwolone relacje w usłudze administratora list_filter. Niestety było to możliwe tylko od wersji 1.3, więc musisz dokonać aktualizacji.

+0

Wolałbym znaleźć filtr błędnika zamiast aktualizacji. Czy masz jakieś sugestie dotyczące tego, jak to osiągnąć? –

+0

Najprawdopodobniej znajdziesz to w niestandardowym szablonie administratora. –

+0

@chrisdpratt: Dobry pomysł, ale w tym przypadku nie używam niestandardowych szablonów administratora. –

Powiązane problemy