2010-12-30 10 views
2

Während ich ein Modell in Djangos Admins list_display zeige, möchte ich zuerst nach einer Spalte und dann nach einer anderen sortieren.
Hier ist ein Beispiel-Modell:Django admin: Second-Level-Bestellung in list_display

class Customer(models.Model): 
    name = models.CharField(max_length=30) 
    the_date = models.DateField() 

Wie dies erreicht werden könnte?

Antwort

1

Ich denke, Sie suchen nach dem Attribut "Bestellung" einer Admin-Klasse.

http://docs.djangoproject.com/en/1.3/ref/contrib/admin/

Edit: Meine vorherige Antwort ist falsch. Laut der obigen Dokumentation ehrt Django nur den ersten Eintrag im Tupel. Es gibt/war a ticket, um das zu lösen, das nirgendwohin ging. Es gibt verschiedene andere vorgeschlagene Lösungen, die ich auch versucht habe, aber keine von ihnen schien mit meiner Version von Django zu funktionieren.

Allerdings bin ich heute im Rahmen eines Projekts auf dieses Problem zurückgekommen und habe endlich etwas gefunden, was mir geholfen hat. Meine Lösung basierte auf this Django snippet, und ich werde den Snippet-Code hier der Vollständigkeit halber posten.

+0

Nein. Django-Dokumentation sagt über das Bestellen: "Django wird nur das erste Element in der Liste/Tupel berücksichtigen; alle anderen werden ignoriert." – Jonathan

+0

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

+0

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

0

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.

0

Sie können dies erreichen, indem Django-Trunk statt 1,3

https://docs.djangoproject.com/en/dev/ref/contrib/admin/

Neu in der Version Django Entwicklung.

Wenn Sie eine dynamische Reihenfolge (z. B. abhängig von Benutzer oder Sprache) angeben müssen, können Sie eine Methode get_Ordering() implementieren.

Geändert in Django Entwicklungsversion.

Django ehrt alle Elemente in die Liste/Tupel; vor 1.4 wurde nur der erste respektiert.