2011-06-22 9 views
16

heredé una aplicación Django v1.2.4 y estoy en el proceso de agregar varias correcciones y mejoras. Durante este proceso, de repente me empecé a encontrar el siguiente error:Django: filtrado por% filter% no permitido

SuspiciousOperation at 
/hometeam/admin/players/playeryear/ 

Filtering by team__season__season_start_date__year not allowed 

Este error se visualiza en las ventanas emergentes de la interfaz de administración cuando intento seleccionar un elemento de un campo de entrada (se accede a través de la lupa asociada a los campos)

Tengo la depuración activada, pero no puedo determinar dónde se está produciendo este error o qué cambio reciente provocó que se inicie. ¿Me puede ayudar a analizar correctamente la salida de depuración para rastrear el filtro errante que está causando este problema?

jugadores/admin.py contiene la clase siguiente:

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 declaraciones list_display y list_filter no cambia el problema.

A continuación se muestra parte de la salida 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 

que ya han aplicado el parche sugirió al https://code.djangoproject.com/changeset/15140, pero no hubo ningún cambio después de que el parche. Cualquier orientación será apreciada.

Respuesta

25

Este problema se ha resuelto según las instrucciones proporcionadas en Chris Adams' blog. Django 1.2.4 introdujo una nueva característica de seguridad que limitaba la posibilidad de utilizar "búsquedas arbitrarias de modelos cruzados a través de la cadena de consulta", como 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 cierto para todos los filtros que desea habilitar. En mi caso, lookup_allowed era la siguiente:

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 la comprobación de seguridad por completo, indicando que efectivamente todas las búsquedas están permitidos. Este fue el comportamiento predeterminado antes de la versión 1.2.4:

def lookup_allowed(self, key): 
    return True 

puede valer la pena señalar que la versión 1.2.5 added a third parameter, 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) 
+3

Gran hallazgo. Gracias. – Cerin

1

Como en el estado release notes for 1.2.4, las búsquedas arbitrarias entre modelos a través de querystring ya no están permitidas, ya que representan un riesgo de seguridad. Ese parche no tiene la intención de volver a habilitarlos.

Debe especificar explícitamente las relaciones permitidas en la propiedad list_filter del administrador. Lamentablemente, esto solo fue posible a partir de la versión 1.3, por lo que deberás actualizar.

+0

yo preferiría encontrar el filtro errante en lugar de actualizar. ¿Tiene alguna sugerencia sobre cómo lograr eso? –

+0

Lo más probable es que lo encuentre en una plantilla de administración personalizada. –

+0

@chrisdpratt: Una buena idea, pero en este caso no estoy usando plantillas de administración personalizadas. –

Cuestiones relacionadas