2010-01-14 21 views
14

Django no admite la obtención de valores de clave foránea de list_display o list_filter (por ejemplo, foo__bar). Sé que puede crear un método de módulo como una solución para list_display, pero ¿cómo voy a hacer lo mismo para list_filter? Gracias.Django: list_filter y campos de clave externa

+1

parece que Django utilizado para apoyar esta función antes de la versión 1.2. 4. No sé por qué lo deshabilitaron ahora. –

Respuesta

11

Bueno, los documentos dicen que puede puede usar ForeignKey tipos de campo en list_filter:

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

Un ejemplo:

# models.py: 
class Foo(models.Model): 
    name = models.CharField(max_length=255) 

    def __unicode__(self): 
     return self.name 

class Bar(models.Model): 
    name = models.CharField(max_length=255) 
    foo = models.ForeignKey(Foo) 

# admin.py: 
class BarAdmin(admin.ModelAdmin): 
    list_filter = ('foo') 

Si desea filtrar por un campo de la relacionada modelo, hay un parche en el camino para hacer que esto funcione (probablemente se fusionará en 1.2 como parece):

http://code.djangoproject.com/ticket/3400

+1

Gracias. Aunque estoy buscando una solución y no un parche. Perdón por no haber especificado eso. – Dan

+5

Esta característica ya no funciona. Los campos de clave externa simplemente no aparecen en la barra lateral, es como si no los especificara. –

2

Si construye la URL para la lista de cambios manualmente, entonces Django no tiene problemas para seguir las relaciones. Por ejemplo:

/admin/contact/contact/?participant__event=8 

o

/admin/contact/contact/?participant__event__name__icontains=er 

Ambos funcionan bien (aunque este último no añadir 'distinta()', así que puede tener duplicados, pero eso no será por lo general un problema para los filtros)

Así que solo tiene que agregar algo a la página que crea los enlaces correctos. Puede hacer esto ya sea anulando la plantilla de la lista de cambios o escribiendo una filterspec personalizada. Hay varios ejemplos que encontré en Google - particularmente en Django Snippets

1

Me encontré con el mismo problema y realmente necesitaba una solución. Tengo una solución que te permite crear un filtro en una propiedad de modelo relacionada con FK. Incluso puede atravesar más de una relación FK. Crea una nueva subclase FilterSpec que subclasifica el valor predeterminado de RelatedFilterSpec utilizado para darle un filtro en un campo ForeignKey.

Ver http://djangosnippets.org/snippets/2260/

3

solución de esta página trabajó para mí http://www.hoboes.com/Mimsy/hacks/fixing-django-124s-suspiciousoperation-filtering/

definen

class SmarterModelAdmin(admin.ModelAdmin): 
    valid_lookups =() 
    def lookup_allowed(self, lookup, *args, **kwargs): 
     if lookup.startswith(self.valid_lookups): 
      return True 
     return super(SmarterModelAdmin, self).lookup_allowed(lookup, *args, **kwargs) 

continuación, permiten la búsqueda de cierto campo de clave externa

class PageAdmin(SmarterModelAdmin): 
    valid_lookups = ('parent') 
+0

Por "('parent')" quiere decir "tuple ('parent')". De lo contrario, elimine los corchetes. –

18

Django soporta list_filter con los campos de clave externa

# models.py: 
class Foo(models.Model): 
    name = models.CharField(max_length=255) 

    def __unicode__(self): 
     return self.name 

class Bar(models.Model): 
    name = models.CharField(max_length=255) 
    foo = models.ForeignKey(Foo) 

# admin.py: 
class BarAdmin(admin.ModelAdmin): 
    list_filter = ('foo__name') 

De la documentación: Los nombres de campo en list_filter también pueden abarcar las relaciones utilizando el __ de búsqueda

+0

Esta es la solución que funcionó para mí, usando Django 1.6. – Pengo

Cuestiones relacionadas