Benutzerdefinierte Filter in Django Admin auf Django 1.3 oder niedriger
Wie kann ich einen benutzerdefinierten filter, um django-admin (die Filter angezeigt, die auf der rechten Seite des Modells dashboard)? Ich weiß, das ist ganz einfach, einen filter basierend auf einem Feld von diesem Modell, aber was ist ein "berechnetes" Feld wie diesem:
class NewsItem(models.Model):
headline = models.CharField(max_length=4096, blank=False)
byline_1 = models.CharField(max_length=4096, blank=True)
dateline = models.DateTimeField(help_text=_("date/time that appears on article"))
body_copy = models.TextField(blank=False)
when_to_publish = models.DateTimeField(verbose_name="When to publish", blank=True, null=True)
# HOW CAN I HAVE "is_live" as part of the admin filter? It's a calculated state!!
def is_live(self):
if self.when_to_publish is not None:
if ( self.when_to_publish < datetime.now() ):
return """ <img alt="True" src="/media/img/admin/icon-yes.gif"/> """
else:
return """ <img alt="False" src="/media/img/admin/icon-no.gif"/> """
is_live.allow_tags = True
class NewsItemAdmin(admin.ModelAdmin):
form = NewsItemAdminForm
list_display = ('headline', 'id', 'is_live')
list_filter = ('is_live') # how can i make this work??
InformationsquelleAutor der Frage sghael | 2009-06-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank gpilotino mir den push in die richtige Richtung für die Umsetzung dieser.
Bemerkte ich, dass die Frage der code ist mit einem datetime-um herauszufinden, Wann sein Leben . So habe ich das DateFieldFilterSpec und Unterklassen.
Verwenden, können Sie den obigen code in eine filters.py und importieren Sie Sie in das Modell, das Sie möchten, fügen Sie die filter, um
InformationsquelleAutor der Antwort Mark Ellul
schreiben Sie eine benutzerdefinierte FilterSpec (nicht documentend überall).
Schauen Sie hier für ein Beispiel:
http://www.djangosnippets.org/snippets/1051/
InformationsquelleAutor der Antwort gpilotino
In der aktuellen django-Entwicklung-version ist die Unterstützung für benutzerdefinierte Filter: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter
InformationsquelleAutor der Antwort matley
Können Sie nicht, leider. Derzeit nicht-Feldelemente können nicht verwendet werden, da list_filter Einträge.
Beachten Sie, dass Ihr admin-Klasse auch gar nicht funktionieren, auch wenn Sie ein Feld als single-item-Tupel muss ein Komma:
('is_live',)
InformationsquelleAutor der Antwort Daniel Roseman
Nur nebenbei: Sie können die deafult Zecken auf Django admin mehr einfach wie diese:
InformationsquelleAutor der Antwort gklka
Nicht optimal (CPU-wise) aber einfach und funktioniert, also mache ich es auf diese Weise (für meine kleine Datenbank). Meine Django-version 1.6.
In admin.py:
...
Wichtige Idee hier ist, um benutzerdefinierte Felder in einem QuerySet über __call__() - Funktion.
InformationsquelleAutor der Antwort Dmitry Sutyagin
Den Benutzer versorgt waren einige Länder PORTOFREI. Ich wollte filter die Länder:
Alle - alle Länder, ja - PORTOFREI, Keine - berechnen wir Porto.
Die wichtigste Antwort für diese Frage nicht für mich arbeiten (Django 1.3) ich denke, da gab es keine
field_path
parameter in der__init__
Methode. Auch ist es UnterklassenDateFieldFilterSpec
. Diepostage
Feld ist ein FloatFieldIn sich selbst.links wir liefern dicts. verwendet, zum erstellen von HTTP-query-strings wie
?postage__exact=0
für jede der möglichen Filter. Filter ich denke sind kumulativ, so dass, wenn es einen früheren Antrag für 'Nein' und jetzt haben wir eine Anfrage für 'ja' wir haben zu entfernen, die"Nein" - Abfrage.
self.removes
legt fest, was entfernt werden muss, für jede Abfrage. Diechoices
Methode erstellt die Abfrage-strings, die sagt, welcher filter ausgewählt wurde und setzt den angezeigten Namen des filters.InformationsquelleAutor der Antwort peter2108
Hier ist die Antwort und implementiert benutzerdefinierte filter so einfach wie möglich, dies könnte helfen,
Django-admin-Datumsbereich filtern
InformationsquelleAutor der Antwort Jay Dave