Beste Weg, um ein Modell suchen-Formular?
Ich habe dieses Modell:
class Aircraft(models.Model):
model = models.CharField(max_length=64, blank=True)
type = models.CharField(max_length=32)
extra = models.CharField(max_length=32, blank=True)
manufacturer = models.CharField(max_length=32)
engine_type = models.IntegerField("Engine Type", choices=ENGINE_TYPE, default=0)
cat_class = models.IntegerField("Category/Class", choices=CAT_CLASSES, default=1)
Und ich habe eine "Suche Flugzeuge" Seite, wo der Benutzer ein Formular, in das Sie Daten eingeben können, die werden verwendet, um alle Flugzeuge, die genau auf Ihre Kriterien. Zum Beispiel kann der Benutzer geben Sie "boeing" in ein Textfeld und "jet" in die engine_type
box, und es wird alle boeing-jets in der Datenbank. Die Art, wie ich bin, dies jetzt zu tun, ist von dieser form:
class AircraftSearch(ModelForm):
search = forms.CharField(max_length=100, required=False)
class Meta:
model = Aircraft
fields = ('engine_type', 'cat_class', )
Und dann eine (unnötig Komplex) Blick wandelt die Daten aus diesem Formular in eine Reihe von filter()
's Hinzugefügt Aircraft.objects.all()
. (Anstatt 4 getrennte Suchfelder für jeden CharField, ich kombiniert haben Sie alle in ein Suche-Feld).
Das alles funktioniert, aber mit einem problem. Wenn der Nutzer will, um auszuschließen, Motortyp von Ihren Suchkriterien, dann sind Sie verschraubt, da "Jeder" ist keine gültige Wahl für den Motor-Typ-Feld. Ich bin zu haben, um ein neues Feld anlegen/widget für Motor Typ und Kategorie/Klasse zu gehören "Alle", die Art von Niederlagen der Zweck der Verwendung eines Modells anzeigen in den ersten Platz
Bin ich mal gespannt. Gibt es einen besseren Weg? Dies scheint eine sehr häufige Aufgabe, die gelöst wurden, indem jemand anderes schon, aber eine google-Suche bringt nichts.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funktional, "jeder" würde erreicht werden, indem nicht nur darunter, dass insbesondere die Suche nach Vektor in den filtern.
Generell
ModelForm
s sind für das erstellen und Bearbeiten von Modellen; in diesem Fall bin ich mir nicht sicher, ob es hilft dir viel mehr als nur tun, eine regelmäßige form:Führen Sie die Suche, Sie dann einfach filtern, wenn Felder nicht leer:
Denke ich, sollten Sie nicht verwenden eine ModelForm.
Typische ModelForm usescase ist-Daten-manipulation, und nicht die Suche.
Stattdessen machen Sie eine völlig neue form, auf der Grundlage der Felder, die Sie brauchen, und mit den Kontrollkästchen dieser Benutzer (de-)aktivieren Sie zum deaktivieren der Suche in einem bestimmten Feld.
Natürlich, Sie noch verwenden sollten, die Entscheidungen, die im Modell definiert, indem Sie einfach importieren Sie die Datei, und verwenden die Liste.