2010-06-15 2 views
5

Ho appena iniziato a giocare con Django oggi e finora trovo piuttosto difficile fare le cose semplici. Ciò di cui sto combattendo in questo momento sta filtrando un elenco di tipi di stato. Il modello è StatusTypes:Filtraggio dei risultati del modello per la casella di selezione admin di Django

class StatusTypes(models.Model): 
    status = models.CharField(max_length=50) 
    type = models.IntegerField() 
    def __unicode__(self): 
     return self.status 
    class Meta: 
     db_table = u'status_types' 

In una pagina di amministrazione ho bisogno di tutti i risultati dove tipo = 0 e in un altro avrò bisogno di tutti i risultati dove tipo = 1 quindi non posso solo limitare dall'interno della modello. Come potrei fare questo?

MODIFICA: Avrei dovuto essere un po 'più chiaro. Ho un modello "Unit" che ha una chiave straniera per StatusTypes. I modelli sono i seguenti:

class StatusTypes(models.Model): 
    status = models.CharField(max_length=50) 
    type = models.IntegerField() 
    def __unicode__(self): 
     return self.status 
    class Meta: 
     db_table = u'status_types' 

class Unit(models.Model): 
    name = models.CharField(unique=True, max_length=50) 
    status = models.ForeignKey(StatusTypes, db_column='status') 
    note = models.TextField() 
    date_added = models.DateTimeField() 
    def __unicode__(self): 
     return self.name 
    class Meta: 
     db_table = u'units' 

Così ora nella pagina di amministrazione per il modello unità voglio limitare lo stato di solo quelli con type = 1. In base al largo di risposta lazerscience qui sotto ho provato il seguente codice:

from inv.inventory.models import Unit 
from django.contrib import admin 

class UnitAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(UnitAdmin, self).queryset(request) 
     return qs.filter(type=0) 

admin.site.register(Unit, UnitAdmin) 

Tuttavia, non ha modificato affatto la casella di selezione. Ho anche provato a stampare il valore di qs e nulla è stato emesso sul mio terminale quindi mi chiedo se devo sapere come chiamare queryset?

EDIT 2: Potrebbe non essere chiaro che voglio filtrarlo per il menu a discesa dello stato che si trova nella pagina di creazione per il modello Unità.

risposta

3

EDIT:

Si scopre che ModelAdmin.formfield_for_foreignkey era la risposta giusta in questa situazione: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

risposta precedente:

Date un'occhiata al list_filter attribute of ModelAdmin. Questo suona più come quello che vuoi per me dal momento che creerà una bella interfaccia per filtrare su criteri diversi piuttosto che limitare arbitrariamente il tuo queryset.

+0

Grazie per la risposta.List_filter non funzionerà perché non puoi avere un'unità con uno stato di tipo = 0 e, a meno che non mi sbagli, list_filter aggiunge solo una barra laterale che offre all'utente l'opzione. Sono piuttosto sorpreso che sia così difficile da fare ... almeno non sono ancora riuscito a trovare una risposta. Tutto quello che voglio essenzialmente fare è aggiungere 'WHERE part = 1' alla query. – blcArmadillo

+0

Forse mi manca il punto su quello che vuoi, ma se aggiungi 'status' all'elenco' list_filter', ti darà un widget che ti permette di filtrare in base a qualsiasi valore consentito per quel campo. Funziona aggiungendo un parametro get all'URL di amministrazione, esattamente come quello che ti serve. –

+0

Gabriel, ho appena capito quale potrebbe essere la confusione. Voglio filtrare i tipi di stato per il campo di selezione dello stato nella pagina di aggiunta. Non aggiungere una colonna di filtri all'elenco delle Unità che sono già state aggiunte. Questo aiuta a chiarire le cose? – blcArmadillo

2

È possibile ignorare il metodo queryset della classe MyModelAdmin:

from django.contrib import admin 

class MyModelAdmin(admin.ModelAdmin): 

    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(type=0) 

admin.site.register(StatusTypes, MyModelAdmin) 

Questo amministratore sarà solo visualizzare gli oggetti del modello che hanno type=0!

+0

Grazie per l'aiuto. Dopo aver risposto, mi sono reso conto di come avrei dovuto dare più informazioni nella domanda, dal momento che ciò che stavo chiedendo non era esattamente ciò che dovevo fare. Ho provato a modificare il codice per soddisfare le mie esigenze, nonché a cercare alcune risorse per la sostituzione del queryset. Ho provato a stampare il valore di qs ma nulla è stato stampato sul mio terminale. Devo in qualche modo chiamare queryset? – blcArmadillo

+0

Dovresti quindi filtrare il tuo queryset in questo modo: 'qs.filter (status__type = 0)'. Alla fine stai parlando di un menu a discesa, cosa intendi con questo? E sì, finché hai qualcosa salvato, dovresti vedere qualcosa nel tuo queryset. Prova 'python manage.py shell',' da myapp.models import Unit', 'Unit.objects.filter (status__type = 0)'; giocare un po 'con quello! –

+0

Grazie per l'aiuto. Lo esaminerò. – blcArmadillo