2010-03-04 18 views
20

Quiero agregar un filtro en una lista de cambios de administrador por una propiedad de una clave externa, p.Filtro Django Admin en la propiedad Clave externa

class Address(model.Models): 
    street = models.CharField(max_length=25)   
    city = models.CharField(max_length=25) 
    country = models.CharField(max_length=25)   

class Customer(models.Model): 
    name = models.CharField(max_length=25) 
    address = models.ForeignKey(Address) 

Digamos que en la lista de cambios de administración al cliente Quiero mostrar un filtro por ciudad y país (por lo que me muestre todos los clientes en un país o ciudad en particular).

Pero la función list_filter() estándar solo parece permitir el filtrado por campos directamente en el modelo y no en ninguna de sus claves foráneas. He intentado:

list_filter = ("address__country",) 

o

list_filter = ("address.country",) 

pero siempre me sale el mismo tipo de error:

'address__country' is not a callable or an attribute 

Cualquier sugerencia será bien recibida. ¿Existe alguna convención/sintaxis de nomenclatura especial para permitir el filtrado en las propiedades de FK?

+0

http://stackoverflow.com/questions/2065036/django-list-filter-and-foreign-key-fields –

Respuesta

0

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/

18

Ver https://code.djangoproject.com/ticket/3400. Funciona bien en Django 1.3 :)

class Room(models.Model): 
    house = models.ForeignKey(House) 

    def __unicode__(self): 
     return self.house.town.name 

class Booking(models.Model): 
    room = models.ForeignKey(Room) 

    def __unicode__(self): 
     return self.room.house.town.name 

class BookingOpts(admin.ModelAdmin): 
    list_filter = ('room__house__town',) 
    raw_id_admin = ('room',) 

admin.site.register(Town) 
admin.site.register(House) 
admin.site.register(Room) 
admin.site.register(Booking, BookingOpts) 
+0

Buena sugerencia, funciona sin problemas en Django 1.3.3, gracias. Nota obvia: la primera y la segunda clase van a models.py y la última con las funciones de registro van a admin.py. rooms__house__town se traduce a rooms.house.town. – chirale

+1

Acabo de encontrar esta solución para un problema similar. Si necesita más potencia en su filtro, investigue extendiendo django.contrib.admin.SimpleListFilter y haciendo rodar su propio filtro. Acabo de hacerlo para mi nuevo proyecto, y es mucho más fácil de lo que parecía al principio. – Hovis

Cuestiones relacionadas