template get_form customize custom django django-admin django-admin-filters

get_form - django filter



Django: Filtrado por% filtro% no permitido (2)

Heredé una aplicación Django v1.2.4 y estoy en el proceso de agregar varias correcciones y mejoras. Durante este proceso, de repente comencé a encontrar el siguiente error:

SuspiciousOperation at /hometeam/admin/players/playeryear/ Filtering by team__season__season_start_date__year not allowed

Este error se muestra en las ventanas emergentes de la interfaz de administración cuando intento seleccionar un elemento para un campo de entrada (al que se accede mediante la lupa asociada a los campos).

La depuración está activada, pero no puedo determinar dónde se está produciendo este error o qué cambio reciente hizo que se iniciara. ¿Puede ayudarme a analizar correctamente la salida de depuración para rastrear el filtro errante que está causando este problema?

players / admin.py contiene la siguiente clase:

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

Comentando las list_display y list_filter no cambia el problema.

A continuación se muestra algunos de los resultados de depuración. Puedo publicar más según sea necesario.

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

Ya he aplicado el parche sugerido en https://code.djangoproject.com/changeset/15140 , pero no hubo cambios después del parche. Cualquier orientación será apreciada.


Como las notas de la versión para el estado 1.2.4 , ya no se permiten búsquedas de modelos cruzados arbitrarios a través de cadenas de consulta, ya que son un riesgo de seguridad. Ese parche no está destinado a volver a habilitarlos.

list_filter especificar las relaciones permitidas explícitamente en la propiedad list_filter del administrador. Desafortunadamente, esto solo fue posible desde la versión 1.3, por lo que deberá actualizar.


Este problema se ha resuelto de acuerdo con las instrucciones proporcionadas en el blog de Chris Adams . Django 1.2.4 introdujo una nueva característica de seguridad que limita la capacidad de usar "búsquedas arbitrarias de modelos cruzados a través de la cadena de consulta", como lo señaló Daniel Roseman en su answer .

La solución para esta versión es definir un método lookup_allowed en FooAdmin ( ''PlayerYearAdmin'' en mi caso) que devuelve verdadero para todos los filtros que desea habilitar. En mi caso, lookup_allowed veía así:

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)

También puede omitir el control de seguridad por completo, indicando efectivamente que todas las búsquedas están permitidas. Este fue el comportamiento predeterminado antes de la versión 1.2.4:

def lookup_allowed(self, key): return True

Puede valer la pena tener en cuenta que la versión 1.2.5 agregó un tercer parámetro , valor , a lookup_allowed . Si está utilizando esa versión, puede definir lookup_allowed así:

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)