Um dies zu erreichen und einen verwendbaren Link "Alle" in Ihrer Seitenleiste zu haben (dh einen Link, der alle anzeigt, anstatt ausstehend anzuzeigen), müssen Sie einen benutzerdefinierten Listenfilter erstellen django.contrib.admin.filters.SimpleListFilter
, der standardmäßig von "ausstehend" erbt und nach "ausstehend" filtert . Etwas in diese Richtung sollte funktionieren:
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: Benötigt Django 1.4 (danke Simon)
choices
Methode in der Lösung nicht überschreiben , ärgerlicherweise weiterhin die eigene Option Alle oben in der Auswahlliste hinzugefügt wird.quelle
Hat die Antwort von ha22109 oben übernommen und geändert, um die Auswahl von "Alle" durch Vergleichen von
HTTP_REFERER
und zu ermöglichenPATH_INFO
.quelle
KeyError
ausgelöst. Wenn Sie dieget()
Methode des Diktats verwenden , können Sie einen Standard angeben. Ich habe einen Standardwert für leere Zeichenfolgen angegeben, damit split () nicht ausgelöst wirdAttributeError
. Das ist alles.has_key()
wird jedoch zugunsten von abgelehntkey in d
. Aber ich weiß, dass Sie gerade die Antwort von ha22109 übernommen haben. Eine Frage: Warum verwenden,request.META['PATH_INFO']
wenn Sie nur verwenden könntenrequest.path_info
(kürzer)?Ich weiß, dass diese Frage jetzt ziemlich alt ist, aber sie ist immer noch gültig. Ich glaube, das ist der richtigste Weg, dies zu tun. Es ist im Wesentlichen dasselbe wie Gregs Methode, jedoch als erweiterbare Klasse für eine einfache Wiederverwendung formuliert.
quelle
Hier ist meine generische Lösung mit Umleitung. Sie prüft nur, ob GET-Parameter vorhanden sind. Wenn keine vorhanden sind, leitet sie mit dem Standardparameter get um. Ich habe auch einen list_filter gesetzt, damit er diesen aufnimmt und den Standard anzeigt.
Die einzige Einschränkung ist, wenn Sie mit "?" Direkt auf die Seite gelangen. In der URL ist kein HTTP_REFERER festgelegt, daher wird der Standardparameter verwendet und umgeleitet. Das ist in Ordnung für mich, es funktioniert großartig, wenn Sie durch den Admin-Filter klicken.
UPDATE :
Um diese Einschränkung zu umgehen, habe ich eine benutzerdefinierte Filterfunktion geschrieben, die die Funktion changelist_view vereinfacht. Hier ist der Filter:
Und die changelist_view übergibt jetzt nur dann den Standardparameter, wenn keiner vorhanden ist. Die Idee war, die generische Filterfunktion zu beseitigen, mit der alle ohne Verwendung von get-Parametern angezeigt werden können. Um alles anzuzeigen, habe ich zu diesem Zweck den Status = 8 zugewiesen:
quelle
quelle
Sie können einfach die Methode
return queryset.filter()
oderif self.value() is None
und Override von SimpleListFilter verwendenquelle
Beachten Sie, dass Sie die
ModelAdmin.queryset()
Methode überschreiben sollten, wenn Sie die Daten nicht vorab auswählen, sondern immer vorfiltern möchten, bevor Sie sie im Administrator anzeigen .quelle
Eine leichte Verbesserung von Gregs Antwort mit DjangoChoices, Python> = 2.5 und natürlich Django> = 1.4.
Danke an Greg für die schöne Lösung!
quelle
Ich weiß, dass dies nicht die beste Lösung ist, aber ich habe die index.html in der Admin-Vorlage, Zeile 25 und 37, wie folgt geändert:
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>
quelle
Ich musste eine Änderung vornehmen, damit die Filterung korrekt funktioniert. Die vorherige Lösung hat bei mir funktioniert, als die Seite geladen wurde. Wenn eine 'Aktion' ausgeführt wurde, kehrte der Filter zu 'Alle' zurück und nicht zu meiner Standardeinstellung. Diese Lösung lädt die Seite mit den Administratoränderungen mit dem Standardfilter, behält jedoch auch Filteränderungen oder den aktuellen Filter bei, wenn andere Aktivitäten auf der Seite auftreten. Ich habe nicht alle Fälle getestet, aber in Wirklichkeit kann es sein, dass die Einstellung eines Standardfilters nur beim Laden der Seite eingeschränkt wird.
quelle
Ein bisschen abseits des Themas, aber meine Suche nach einer ähnlichen Frage führte mich hierher. Ich wollte eine Standardabfrage nach Datum haben (dh wenn keine Eingabe bereitgestellt wird, zeigen Sie nur Objekte mit
timestamp
'Heute' an), was die Frage etwas kompliziert macht. Folgendes habe ich mir ausgedacht:Dies ist eine einfache Überschreibung der Standardeinstellung
DateFieldListFilter
. Durch die Einstellungself.date_params
wird sichergestellt, dass die Filter-Dropdown-Liste auf die entsprechende Option aktualisiert wirdself.used_parameters
. Aus diesem Grund müssen Sie sicherstellen, dassself.used_parameters
genau das ist, was von einer dieser Dropdown-Auswahl verwendet wird (dh finden Sie heraus, was dasdate_params
wäre, wenn Sie "Heute" oder "Letzte 7 Tage" verwenden, und konstruieren Sie dasself.used_parameters
entsprechenden Einstellungen).Dies wurde für Django 1.4.10 entwickelt
quelle
Dies mag ein alter Thread sein, aber ich dachte, ich würde meine Lösung hinzufügen, da ich bei Google-Suchen keine besseren Antworten finden konnte.
Tun Sie, was (nicht sicher, ob sein Deminic Rodger oder ha22109) im ModelAdmin für changelist_view geantwortet hat
Dann müssen wir einen benutzerdefinierten SimpleListFilter erstellen
quelle
Hier ist die sauberste Version, die ich aus einem Filter mit einem neu definierten 'Alle' und einem ausgewählten Standardwert generieren konnte.
Wenn zeigt mir standardmäßig die aktuell stattfindenden Reisen.
quelle
Erstellt eine wiederverwendbare Filter-Unterklasse, inspiriert von einigen der Antworten hier (hauptsächlich Gregs).
Vorteile:
Wiederverwendbar - In alle Standardklassen
ModelAdmin
steckbarErweiterbar - Einfach, zusätzliche / benutzerdefinierte Logik für hinzuzufügen
QuerySet
FilternEinfache Verwendung - In der einfachsten Form müssen nur ein benutzerdefiniertes Attribut und eine benutzerdefinierte Methode implementiert werden (abgesehen von denen, die für die SimpleListFilter-Unterklasse erforderlich sind).
Intuitiver Administrator - Der Filterlink "Alle" funktioniert wie erwartet. wie alle anderen auch
Keine Weiterleitungen - Keine Notwendigkeit, die
GET
Anforderungsnutzlast zu überprüfen , unabhängig vonHTTP_REFERER
(oder anderen anforderungsbezogenen Dingen in ihrer Grundform)Keine (Änderungslisten-) Ansichtsmanipulation - Und keine Vorlagenmanipulationen (Gott bewahre)
Code:
(Die meisten
import
s sind nur für Typhinweise und Ausnahmen)Beispiel für die vollständige Verwendung:
Hoffe das hilft jemandem; Feedback immer geschätzt.
quelle