8 votes

Django-admin trier par plusieurs champs

Comment puis-je commander par plusieurs champs dans le django-admin?

Merci

12voto

user535010 Points 111

Essayez ceci:

Définissez l'ordre dans votre modèle Meta:

class Meta:
    ordering = ["some_field", "other_field"]

et ajoutez cette classe dans admin.py:

from django.contrib.admin.views.main import ChangeList

class SpecialOrderingChangeList(ChangeList): 
    """ 
     contournement du problème d'ordonnancement de Django 1.3 
     à partir de 1.4, il suffit d'utiliser la variable `ordering` 
    """ 
    def get_query_set(self): 
        queryset = super(SpecialOrderingChangeList, self).get_query_set() 
        return queryset.order_by(*self.model._meta.ordering) 

Ajoutez cette méthode dans votre admin.ModelAdmin

def get_changelist(self, request, **kwargs): 
    return SpecialOrderingChangeList

source: https://groups.google.com/forum/?fromgroups#!topic/django-users/PvjClVVgD-s

3voto

second Points 11641

Jusqu'à django 1.4 (actuellement en alpha), l'admin django ne trie que par la première colonne dans Meta ordering. Vous pouvez contourner cela en remplaçant la requête :

class MyAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(MyAdmin, self).queryset(request)
        qs = qs.order_by('last_name', 'first_name')
        return qs

1voto

jenniwren Points 53

Suite à la réponse de l'utilisateur535010 ci-dessus: J'ai eu du mal car après avoir ajouté le code suggéré, je n'ai plus été en mesure de classer les champs en cliquant sur les en-têtes dans la vue de la liste d'administration. J'ai modifié la méthode get_changelist suggérée pour MyModelAdmin comme suit:

def get_changelist(self, request, **kwargs):  #problème de classement dans le contournement 1.3
    try:
        if not request.GET['o']:
            return SpecialOrderingChangeList
    except KeyError:
        pass
    return super(MyModelAdmin, self).get_changelist(request)

1voto

niekas Points 1228

Le modèle administratif de Django prend en charge le tri par plusieurs valeurs dans Django 2.0+. Vous pouvez maintenant l'utiliser comme ceci :

class MonAdmin(admin.ModelAdmin):
    ordering = ['last_name', 'first_name']

0voto

La fonction requise pour que le clic sur le tri multicolumnaire fonctionne avec la correction de tri est la suivante :

    def get_changelist(self, request, **kwargs): 
        try:
            if request.GET['o']:
                return super(ModelAdmin, self).get_changelist(request)
        except KeyError:
            pass
        return SpecialOrderingChangeList

De l'autre côté de la réponse de jenniwren :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X