Django: Changelist-Filter als Drop-Down
Django bietet mit contrib.admin
eine sehr gute Möglichkeit schnell ein
Admin-Interface für CRUD-Operationen zu erstellen. In den Listen-Ansichten
der Objekte gibt es die Möglichkeit dem Benutzer Filter zu präsentieren,
mit denen er die angezeigten Objekte nach bestimmten Kriterien eingrenzen kann.
Diese Filter sehen normalerweise so aus:
Welche Filter zur Verfügung stehen, wird relativ einfach über die ModelAdmin
Klasse, oder direkt als Parameter beim Registrieren des Models mit der
Admin-Site festgelegt.
admin.site.register(MyModel, list_filter=('field_1', 'field_2'))
Schwierig wird es nur, wenn man auf Feldern filtern möchte, die sehr viele Mögliche Werte haben können. Dann wird alleine die Leiste mit den Filtern schon mal länger, als die Liste mit den Objekte selbst. Ebenso kann es voll werden, wenn man sehr viele Filter einsetzt.
Man kann in diesem Fall die Übersichtlichkeit erhöhen, in dem man die Filter als Drop-Down Select-Boxen darstellt, statt wie standardmäßig als Listen untereinander.
Solange man diese Änderung global für alle Filter der Admin-Site durchführen
will, ist das Ganze recht simpel. Man legt im Template-Order ein neues
Template admin/filter.html
an, welches das default Template von
contrib.admin
überschreibt und kopiert folgenden Inhalt hinnein:
{% load i18n %} <h3>{% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3> <select onchange="window.location=\ window.location.pathname+this.options[this.selectedIndex].value"> {% for choice in choices %} <option{% if choice.selected %} selected="selected"{% endif %} value="{{ choice.query_string|iriencode }}">{{ choice.display }}</option> {% endfor %} </select>
(Einige Zeilenumbrüche für bessere Lesbarkeit hinzugefügt)
Vergleicht man dieses Template mit dem default admin/filter.html
Template,
sieht man, dass die Änderung minimal ist. Die Liste wurde durch eine Select-Box
ersetzt und kleines Stück JavaScript sorgt dafür, dass beim Auswählen von
Optionen die Seite mit dem Filter neu geladen wird. Normalerweise passiert
dies durch den Klick auf den entsprechenden Link.
Danke!
Geschrieben von Anonymous Coward 11 Monate nach Veröffentlichung des Blog-Eintrags am 28. Jan. 2010, 10:05. Antworten
That's is a really nice thing to know how customize. Thx to post about :) (and thx to google translator to translate your text ;])
Geschrieben von Felipe 'chronos' Prenholato 1 Jahr, 3 Monate nach Veröffentlichung des Blog-Eintrags am 8. Juni 2010, 20:28. Antworten
Super Sache! Danke!
Aber es funktioniert auch für einzelne Apps bzw. sogar Models:
http://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-admin-templates
To override an admin template for a specific app, copy and edit the template from the django/contrib/admin/templates/admin directory, and save it to one of the directories you just created.
For example, if we wanted to add a tool to the change list view for all the models in an app named my_app, we would copy contrib/admin/templates/admin/change_list.html to the templates/admin/my_app/ directory of our project, and make any necessary changes.
If we wanted to add a tool to the change list view for only a specific model named 'Page', we would copy that same file to the templates/admin/my_app/page directory of our project.
Geschrieben von Christian Klein 1 Jahr, 4 Monate nach Veröffentlichung des Blog-Eintrags am 27. Juli 2010, 14:04. Antworten
Hallo Christian,
hast Du das auch wirklich ausprobiert? Die Filter werden vom Templatetag "admin_list_filter" erzeugt, welcher ein inclusion-tag ist, dieser wählt das Template nicht passend zum Model oder zur App aus, sondern hat den Pfad "admin/filter.html" fest eincodiert. Ich denke also nicht dass so geht, wie Du schreibst.
Geschrieben von Arne 1 Jahr, 4 Monate nach Veröffentlichung des Blog-Eintrags am 27. Juli 2010, 15:07. Antworten