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:

Changelist Filter

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.

Changelist mit Drop-Downs

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.


Kommentare