Pour ce faire et avoir un lien «Tous» utilisable dans votre barre latérale (c'est-à-dire un lien qui montre tout plutôt que d'afficher en attente), vous devez créer un filtre de liste personnalisé, héritant de django.contrib.admin.filters.SimpleListFilter
et filtrant sur «en attente» par défaut. Quelque chose de ce genre devrait fonctionner:
from datetime import date
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter
class StatusFilter(SimpleListFilter):
title = _('Status')
parameter_name = 'status'
def lookups(self, request, model_admin):
return (
(None, _('Pending')),
('activate', _('Activate')),
('rejected', _('Rejected')),
('all', _('All')),
)
def choices(self, cl):
for lookup, title in self.lookup_choices:
yield {
'selected': self.value() == lookup,
'query_string': cl.get_query_string({
self.parameter_name: lookup,
}, []),
'display': title,
}
def queryset(self, request, queryset):
if self.value() in ('activate', 'rejected'):
return queryset.filter(status=self.value())
elif self.value() == None:
return queryset.filter(status='pending')
class Admin(admin.ModelAdmin):
list_filter = [StatusFilter]
EDIT: Nécessite Django 1.4 (merci Simon)
choices
méthode dans la solution, elle continuera à ajouter sa propre option Tous en haut de la liste de choix.la source
A pris la réponse de ha22109 ci-dessus et modifié pour permettre la sélection de "Tous" en comparant
HTTP_REFERER
etPATH_INFO
.la source
KeyError
, alors que si vous utilisez laget()
méthode de dict, vous pouvez spécifier une valeur par défaut. J'ai spécifié une valeur par défaut de chaîne vide pour que split () ne lance pasAttributeError
. C'est tout.has_key()
est déconseillé au profit dekey in d
, cependant. Mais je sais que vous venez de prendre la réponse de ha22109. Une question: pourquoi utiliserrequest.META['PATH_INFO']
alors que vous pourriez simplement utiliserrequest.path_info
(plus court)?Je sais que cette question est assez ancienne maintenant, mais elle est toujours valable. Je pense que c'est la manière la plus correcte de procéder. C'est essentiellement la même que la méthode de Greg, mais formulée comme une classe extensible pour une réutilisation facile.
la source
Voici ma solution générique utilisant la redirection, elle vérifie simplement s'il existe des paramètres GET, s'il n'en existe pas, elle redirige avec le paramètre get par défaut. J'ai également un list_filter défini pour qu'il le récupère et affiche la valeur par défaut.
La seule mise en garde est lorsque vous accédez directement à la page avec "?" présent dans l'url, il n'y a pas de jeu HTTP_REFERER donc il utilisera le paramètre par défaut et redirigera. Cela me convient, cela fonctionne très bien lorsque vous cliquez sur le filtre d'administration.
MISE À JOUR :
Afin de contourner la mise en garde, j'ai fini par écrire une fonction de filtre personnalisée qui simplifiait la fonctionnalité changelist_view. Voici le filtre:
Et le changelist_view ne transmet désormais le paramètre par défaut que si aucun n'est présent. L'idée était de se débarrasser de la capacité des filtres génériques à tout afficher en n'utilisant aucun paramètre get. Pour voir tout, j'ai attribué le statut = 8 à cette fin:
la source
la source
Vous pouvez simplement utiliser la méthode
return queryset.filter()
orif self.value() is None
et Override de SimpleListFilterla source
Notez que si au lieu de présélectionner une valeur de filtre, vous souhaitez toujours pré-filtrer les données avant de les afficher dans l'administrateur, vous devez remplacer la
ModelAdmin.queryset()
méthode à la place.la source
Une légère amélioration par rapport à la réponse de Greg en utilisant DjangoChoices, Python> = 2.5 et bien sûr Django> = 1.4.
Merci à Greg pour la belle solution!
la source
Je sais que ce n'est pas la meilleure solution, mais j'ai changé l'index.html dans le modèle d'administration, lignes 25 et 37 comme ceci:
25:
<th scope="row"><a href="{{ model.admin_url }}{% ifequal model.name "yourmodelname" %}?yourflag_flag__exact=1{% endifequal %}">{{ model.name }}</a></th>
37:
<td><a href="{{ model.admin_url }}{% ifequal model.name "yourmodelname" %}?yourflag__exact=1{% endifequal %}" class="changelink">{% trans 'Change' %}</a></td>
la source
J'ai dû faire une modification pour que le filtrage fonctionne correctement. La solution précédente a fonctionné pour moi lorsque la page s'est chargée. Si une «action» était effectuée, le filtre revenait à «Tous» et non à ma valeur par défaut. Cette solution charge la page de modification de l'administrateur avec le filtre par défaut, mais conserve également les modifications de filtre ou le filtre actuel lorsqu'une autre activité se produit sur la page. Je n'ai pas testé tous les cas, mais en réalité, cela peut limiter le réglage d'un filtre par défaut pour qu'il se produise uniquement lorsque la page se charge.
la source
Un peu hors sujet mais ma recherche d'une question similaire m'a conduit ici. Je cherchais à avoir une requête par défaut par date (c'est-à-dire si aucune entrée n'est fournie, n'afficher que les objets avec
timestamp
«Aujourd'hui»), ce qui complique un peu la question. Voici ce que j'ai trouvé:Il s'agit d'un simple remplacement de la valeur par défaut
DateFieldListFilter
. En définissantself.date_params
, il garantit que la liste déroulante du filtre sera mise à jour selon l'option qui correspond auself.used_parameters
. Pour cette raison, vous devez vous assurer que leself.used_parameters
sont exactement ce qui serait utilisé par l'une de ces sélections déroulantes (c'est-à-dire, découvrez ce quedate_params
serait lorsque vous utilisez "Aujourd'hui" ou "7 derniers jours" et construisez leself.used_parameters
pour correspondre à ceux-ci).Cela a été conçu pour fonctionner avec Django 1.4.10
la source
Il s'agit peut-être d'un ancien fil de discussion, mais je pensais ajouter ma solution car je ne pouvais pas trouver de meilleures réponses sur les recherches Google.
Faites quoi (je ne sais pas si son Deminic Rodger, ou ha22109) a répondu dans ModelAdmin pour changelist_view
Ensuite, nous devons créer un SimpleListFilter personnalisé
la source
Voici la version la plus propre que j'ai pu générer d'un filtre avec un 'Tout' redéfini et une valeur par défaut sélectionnée.
Si me montre par défaut les voyages en cours.
la source
Création d'une sous-classe de filtre réutilisable, inspirée de certaines des réponses ici (principalement celles de Greg).
Avantages:
Réutilisable - enfichable dans toutes les
ModelAdmin
classes standardExtensible - Facile à ajouter une logique supplémentaire / personnalisée pour le
QuerySet
filtrageFacile à utiliser - Dans sa forme la plus basique, un seul attribut personnalisé et une méthode personnalisée doivent être implémentés (en dehors de ceux requis pour la sous-classification SimpleListFilter)
Administration intuitive - Le lien de filtre «Tous» fonctionne comme prévu; comme tous les autres
Pas de redirection - Pas besoin d'inspecter la
GET
charge utile de la demande, indépendamment deHTTP_REFERER
(ou de tout autre élément lié à la demande, dans sa forme de base)Aucune manipulation de vue (liste de modifications) - Et aucune manipulation de modèle (à Dieu ne plaise)
Code:
(la plupart des
import
s sont juste pour les conseils de type et les exceptions)Exemple d'utilisation complet:
J'espère que cela aide quelqu'un; rétroaction toujours appréciée.
la source