2010-03-04 25 views
20

Desidero aggiungere un filtro in un elenco modifiche amministratore mediante una proprietà di una chiave esterna, ad es.Filtro admin Django su proprietà Chiave esterna

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) 

Diciamo che nel changelist amministrazione cliente voglio mostrare un filtro per città e campagna (così mi mostra tutti i clienti in un determinato paese o città).

Ma la funzionalità standard list_filter() sembra consentire solo il filtraggio per campi direttamente sul modello e non su nessuna sua chiave esterna. Ho provato:

list_filter = ("address__country",) 

o

list_filter = ("address.country",) 

ma ottengo sempre lo stesso tipo di errore:

'address__country' is not a callable or an attribute 

Qualsiasi suggerimento sarebbe il benvenuto. C'è qualche convenzione di denominazione/sintassi speciale per consentire il filtraggio sulle proprietà FK?

+0

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

risposta

0

Mi sono imbattuto nello stesso problema e avevo davvero bisogno di una soluzione. Ho una soluzione alternativa che consente di creare un filtro su una proprietà del modello relativa a FK. Puoi anche attraversare più di una relazione FK. Crea una nuova sottoclasse FilterSpec che sottoclasse il file RelatedFilterSpec predefinito utilizzato per fornire un filtro su un campo ForeignKey.

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

18

Vedi https://code.djangoproject.com/ticket/3400. Funziona bene in 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

Bel suggerimento, funziona senza problemi su Django 1.3.3, grazie. Nota ovvia: la prima e la seconda classe vanno a models.py e l'ultima con le funzioni di registro va su admin.py. rooms__house__town è tradotto in rooms.house.town. – chirale

+1

Ho appena trovato questa soluzione per un problema simile. Se hai bisogno di più potenza nel tuo filtro, cerca di estendere django.contrib.admin.SimpleListFilter e arrotolando il tuo filtro. L'ho appena fatto per il mio nuovo progetto, ed è molto più facile di quanto non sembrasse all'inizio. – Hovis

Problemi correlati