Dies ist auf Bogeyman Apr 1 bearbeitete Antwort basiert, aber auf das wesentliche Merkmal heruntergebrochen.
In meinem models.py definieren ordering
in den Modellen Meta
wie gewohnt:
class Customer(models.Model):
name = models.CharField(max_length=30)
the_date = models.DateField()
class Meta:
ordering = ('the_date', 'name') # sort by date then name.
Dann in admin.py Unterklasse ChangeList
, aber die query_set zwingen letztlich durch die Bestellung in der Meta von der angegebenen sortiert werden Modell.
from django.contrib import admin
from django.contrib.admin.views.main import ChangeList
class SpecialOrderingChangeList(ChangeList):
def get_query_set(self):
queryset = super(SpecialOrderingChangeList, self).get_query_set()
return queryset.order_by(*self.model._meta.ordering)
class CustomerAdmin(admin.ModelAdmin):
def get_changelist(self, request, **kwargs):
return SpecialOrderingChangeList
admin.site.register(Customer, CustomerAdmin)
Wenn Sie lieber die Reihenfolge im ModelAdmin definieren; Du könntest das auch tun; Ändern Sie einfach return queryset.order_by(*self.model._meta.ordering)
in return queryset.order_by(*self.model_admin.ordering)
und fügen Sie eine Liste hinzu, die ordering = ['the_date', 'name']
in CustomerAdmin
definiert.
Nein. Django-Dokumentation sagt über das Bestellen: "Django wird nur das erste Element in der Liste/Tupel berücksichtigen; alle anderen werden ignoriert." – Jonathan
Gut entdeckt. Komisch, ich habe das viele Male benutzt, vorausgesetzt, dass es ein Tupel war, dass es von allen Spalten geordnet wurde. Ich denke, ich habe nie bemerkt, dass es nicht war! In diesem Fall müssten wir die Methode queryset() des ModelAdmin des Modells überschreiben, um die Sortierreihenfolge zu ändern. – bogeymin
Ich habe das auch versucht und es hat nicht geholfen.Wenn Sie in dieser Richtung Erfolg haben, könnten Sie bitte Ihren Code posten? – Jonathan