Zwischenzeitlich hatte ich chatGPT mal mit dem Problem beschäftigt. Interessiert es auch, was (er/sie/es/non) dazu sagt?
Der letzte Vorschlag:
Es tut mir leid für das Missverständnis. Sie haben recht, die Reihenfolge, die Sie im ordering-Attribut festlegen, wirkt sich auf die Anzeige der Objekte aus, nicht auf die Anzeige der Filter. Das Sortieren der Filter selbst ist in Django standardmäßig nicht direkt unterstützt.
Wenn Sie die Reihenfolge der Filter im Dropdown-Menü ändern möchten, ist dies eine etwas komplexere Anpassung, die über die Standardfunktionen von Django hinausgeht. Sie könnten diese Anpassung erreichen, indem Sie das Template für den Admin-Bereich überschreiben und die Filter manuell sortieren. Hier ist eine allgemeine Anleitung, wie Sie vorgehen könnten:
Erstellen Sie eine Datei templates/admin/filter.html in Ihrem Projekt, wenn sie noch nicht vorhanden ist.
In dieser Datei können Sie die Filter manuell sortieren, indem Sie eine benutzerdefinierte Schleife verwenden:
html
{% load i18n admin_urls %}
{% for spec in filter_specs %}
<div class="grp-module">
<h2>{{ spec.title }}</h2>
<ul class="grp-module-content">
{% if spec.choices %}
{% for choice in spec.choices %}
<li>
<a href="{{ spec.get_query_string(choice) }}" class="{% if choice.selected %}selected{% endif %}">
{{ choice.display }}
</a>
</li>
{% endfor %}
{% endif %}
</ul>
</div>
{% endfor %}
Jetzt können Sie die Methode extra_context in Ihrem ZaehlerAdmin verwenden, um das von Ihnen erstellte Template einzubinden:
python
class ZaehlerAdmin(admin.ModelAdmin):
list_filter = ("user", "kategorie",)
ordering = ["user__vorname", "kategorie__zeile"]
def get_filters(self, request):
filters = super().get_filters(request)
sorted_filters = sorted(filters.items(), key=lambda f: f[0])
return dict(sorted_filters)
def changelist_view(self, request, extra_context=None):
if extra_context is None:
extra_context = {}
extra_context['title'] = "Filter"
extra_context['user_filter'] = self.get_filters(request)['user']
return super().changelist_view(request, extra_context=extra_context)
def get_template_list(self, request):
return ["admin/filter.html"] + super().get_template_list(request)
Dieser Ansatz fügt eine benutzerdefinierte Filteranzeige hinzu, in der die Filter manuell sortiert sind. Bitte beachten Sie, dass dies eine fortgeschrittene Anpassung ist, und Sie möglicherweise weitere Anpassungen und Tests durchführen müssen, um sie an Ihre spezifischen Anforderungen anzupassen.
Denken Sie daran, die Django-Dokumentation zu konsultieren und den Code entsprechend Ihrer Django-Version und Modellstruktur anzupassen.
Ich habe ihm/ihr dann mitgeteilt, dass ich eine Fehlermeldung "'super' object has no attribute 'get_filters'" erhalte.
Die Antwort:
Es tut mir leid für das Missverständnis. Der Fehler tritt auf, weil es tatsächlich keine Methode namens get_filters in der ModelAdmin-Klasse gibt. Ich habe einen Fehler gemacht, und ich entschuldige mich dafür. Das war mein Fehler.
Die Filter im Admin-Bereich zu sortieren, ist leider keine einfache Aufgabe, da die Admin-Schnittstelle von Django diese Funktionalität standardmäßig nicht unterstützt. Es erfordert erweitertes Wissen in Django und möglicherweise umfangreiche Anpassungen im Admin-Interface.
In vielen Fällen könnte die beste Vorgehensweise sein, mit den standardmäßigen Filteroptionen zu arbeiten und darauf zu achten, die Namen der Optionen so zu wählen, dass sie leicht zu erkennen und zu sortieren sind.
Wenn das Sortieren der Filter für Ihre Anwendung von entscheidender Bedeutung ist, könnte es sich lohnen, in Betracht zu ziehen, benutzerdefinierte Ansichten und Filter-Optionen außerhalb des Django-Admin-Interfaces zu erstellen, um die gewünschte Funktionalität zu erreichen. Dies würde mehr Aufwand erfordern, bietet Ihnen jedoch die Flexibilität, die Sie benötigen.
Nochmals Entschuldigung für die Verwirrung, und vielen Dank für Ihr Verständnis.
Jetzt probiere ich mal @noisefloor s Vorschlag aus.