7 Stimmen

Filtern von Modellergebnissen für Django-Admin-Auswahlfeld

Ich habe erst heute angefangen, mit Django zu spielen und finde es bisher ziemlich schwierig, einfache Dinge zu tun. Womit ich im Moment kämpfe, ist das Filtern einer Liste von Statustypen. Das StatusTypes Modell ist:

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'

Auf einer Verwaltungsseite benötige ich alle Ergebnisse mit Typ = 0 und auf einer anderen Seite alle Ergebnisse mit Typ = 1, so dass ich sie nicht einfach aus dem Modell heraus einschränken kann. Wie würde ich vorgehen, um dies zu tun?

EDITAR: Ich hätte mich etwas deutlicher ausdrücken sollen. Ich habe ein Modell "Unit", das einen Fremdschlüssel zu StatusTypes hat. Die Modelle sind wie folgt:

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'

So jetzt in der Admin-Seite für die Einheit Modell möchte ich den Status auf nur diejenigen mit Typ = 1 zu begrenzen. Basierend auf lazerscience Antwort unten habe ich versucht, den folgenden Code:

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)

Aber das Auswahlfeld hat sich dadurch nicht verändert. Ich habe auch versucht, den Wert von qs zu drucken und nichts wurde auf meinem Terminal ausgegeben, also frage ich mich, ob ich irgendwie queryset aufrufen muss?

EDIT 2: Es war vielleicht nicht klar, dass ich dies für das Dropdown-Menü "Status" filtern möchte, das sich auf der Seite "Erstellen" für das Modell "Einheit" befindet.

6voto

Gabriel Hurley Punkte 38778

EDITAR:

Es stellte sich heraus, dass ModelAdmin.formfield_for_foreignkey in dieser Situation die richtige Antwort war: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

VORHERIGE ANTWORT:

Werfen Sie einen Blick auf die list_filter-Attribut von ModelAdmin . Das klingt für mich eher nach dem, was Sie wollen, da es eine schöne Schnittstelle für die Filterung nach verschiedenen Kriterien schafft, anstatt Ihre Abfrage willkürlich einzuschränken.

2voto

Bernhard Vallant Punkte 46005

Sie können die queryset Methode Ihrer MyModelAdmin Klasse:

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)

Dieser Admin wird Ihnen nur Objekte Ihres Modells anzeigen, die type=0 !

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X