Wie paginiere ich Django mit anderen Variablen?
Ich habe Probleme mit der Paginierung in Django. Nehmen Sie die URL unten als Beispiel:
http://127.0.0.1:8000/users/?sort=first_name
Auf dieser Seite habe ich sozusagen eine Liste der Benutzer, die durch Ihren Vorname ein. Ohne eine Art GET-variable wird standardmäßig Sortieren nach id.
Nun, wenn ich auf den nächsten link, den ich erwarten, dass die folgende URL:
http://127.0.0.1:8000/users/?sort=first_name&page=2
Stattdessen verliere ich alle get-Variablen und am Ende mit
http://127.0.0.1:8000/users/?page=2
Dies ist ein problem, weil die zweite Seite ist sortiert nach id statt Vorname.
Wenn ich Anfrage.get_full_path ich schließlich am Ende mit einem hässlichen URL:
http://127.0.0.1:8000/users/?sort=first_name&page=2&page=3&page=4
Was ist die Lösung? Gibt es eine Möglichkeit, den Zugriff auf die GET-Variablen auf der Vorlage und ersetzen Sie den Wert für die Seite?
Ich bin mit Seitenzahlen, wie beschrieben in Django-Dokumentation und meine Präferenz ist es, weiter zu verwenden. Die code Vorlage die ich verwende, ist ähnlich wie diese:
{% if contacts.has_next %}
<a href="?page={{ contacts.next_page_number }}">next</a>
{% endif %}
InformationsquelleAutor der Frage vagabond | 2010-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich dachte, die benutzerdefinierte tags, die vorgeschlagen wurden, sind zu Komplex, das ist, was ich getan habe in der Vorlage:
Und die tag-Funktion:
Wenn die url_param ist noch nicht in der url, es wird Hinzugefügt werden mit dem Wert. Wenn es schon da ist, wird es ersetzt durch den neuen Wert. Dies ist eine einfache Lösung die zu mir passt, aber nicht funktioniert, wenn die url hat mehrere Parameter mit dem gleichen Namen.
Müssen Sie auch die RequestContext-request-Instanz bereitgestellt werden, um Ihre Vorlage aus Ihrer Sicht. Mehr info hier:
http://lincolnloop.com/blog/2008/may/10/getting-requestcontext-your-templates/
InformationsquelleAutor der Antwort mpaf
Ich denke url_replace Lösung kann umgeschrieben werden mehr elegant als
mit Vorlage-Zeichenfolge vereinfacht
Dies ermöglicht das ersetzen mehrerer Tasten aber nicht Abfragen, mit sich wiederholenden Schlüssel.
InformationsquelleAutor der Antwort skoval00
Nach einigem Herumspielen habe ich eine Lösung gefunden... obwohl ich nicht weiß, ob es wirklich gut. Ich würde lieber eine elegante Lösung.
Trotzdem gebe ich die Anfrage an die Vorlage und bin in der Lage, Zugriff auf alle GET-Variablen via Anfrage.BEKOMMEN. Dann habe ich eine Schleife durch die GET-Wörterbuch und solange die variable nicht Seite, die ich drucken.
InformationsquelleAutor der Antwort vagabond
In Ihrem
views.py
Sie irgendwie Zugriff auf die Kriterien, nach denen man Sie Sortieren, z.B.first_name
. Sie müssen pass, die Wert auf die Vorlage und legen Sie es dort zu erinnern.Beispiel:
InformationsquelleAutor der Antwort miku
Kann man einen Kontext-Prozessor zu verwenden, wenn die Paginierung angewendet wird.
Beispielsweise in
my_project/my_app/context_processors.py
:Fügen Sie das Kontext-Prozessor, um Ihre Django Projekt-Einstellungen:
Dann, in Ihren Vorlagen verwenden, können Sie diese beim umbrechen:
Was GET-Variablen Sie haben in Ihrer Anfrage, Sie wird angehängt, nachdem der
?page=
GET-parameter.InformationsquelleAutor der Antwort José L. Patiño
Ich hatte dieses problem während der Verwendung von django-bootstrap3. Die (einfache) Lösung, die ohne template-tags benutzen:
Dauerte eine Weile, um das herauszufinden... ich es schließlich Tat, Dank dieser Beitrag.
InformationsquelleAutor der Antwort Kopfgeldjaeger
Hier ist eine nützliche benutzerdefinierte template-tag für den Bau von query-strings.
Wenn die URL http://example.com/django/page/?search=sometextder generierte HTML-Code sollte so etwas wie:
Weitere Beispiele:
Schließlich den Quellcode (geschrieben von mir):
InformationsquelleAutor der Antwort Rockallite
Dies ist eine einfache Art und Weise, wie ich es tun
Im Blick :
Dann in Vorlage:
InformationsquelleAutor der Antwort Armance
Verbesserung der diese von:
Verwenden
urlencode
ausdjango
statturllib
um zu verhindern, dassUnicodeEncodeError
Fehler mitunicode
Argumente.Template-tag:
Vorlage:
InformationsquelleAutor der Antwort Omid Raha
Jeder link, den Sie setzen in Ihrer Sicht ausgerüstet sein, mit entsprechenden Parametern. Es gibt keine implizite Magie umwandeln würde:
http://127.0.0.1:8000/users/?page=2
in:
http://127.0.0.1:8000/users/?sort=first_name&page=2
Also, was Sie brauchen, ist einige
Sorter
Objekt/Klasse/Funktion/snippet (was könnte hier passen, ohne es zu übertreiben), würde das handeln, ähnlich wie django.core.paginator.Paginator, würde aber Griffsort
GET-parameter.Könnte es so einfach wie diese:
Dann, aus Ihrer Sicht:
Konnte ich werden, die mehr generisch, aber ich hoffe, Sie bekommen das Konzept.
InformationsquelleAutor der Antwort Tomasz Zielinski
'path': request.get_full_path().rsplit('&page')[0],
InformationsquelleAutor der Antwort
Ich würde sagen, generieren Sie die nächsten und vorherigen link von deinem controller, dann übergeben es an die anzeigen und verwenden Sie es von dort. Ich werde Ihnen ein Beispiel geben (mehr wie ein pseudocode):
dann in Ihrer Ansicht verwenden Sie es wie diese:
InformationsquelleAutor der Antwort sm13294
Werden Sie zurückgeben müssen, ERHALTEN Sie so oben angegeben. Sie können übergeben, die GET-Anforderung " - Teil der url durch den Aufruf
dann können Sie dies in der Vorlage erstellen Sie Ihre URL z.B.
InformationsquelleAutor der Antwort ajaali
Mit Django, die Paginierung, dass die GET-Parametern ist einfach.
Kopieren Sie zuerst die GET-Parametern auf eine variable (in Sicht):
aus und senden Sie es, um die Vorlage in via Kontext-Wörterbuch:
Zweite Sache, die Sie tun müssen, ist, verwenden Sie es, geben Sie in die url-Aufrufe (href) in den template - Beispiel (Erweiterung des basic-Paginierung html-Griff extra param condition):
Quelle
InformationsquelleAutor der Antwort Nabeel Ahmed
Anderes nehmen auf die url_encode Lösung, in diesem Fall vereinfacht, indem skoval00.
Hatte ich ein paar Probleme mit dieser version. Ein, es hatte nicht die Unterstützung der Unicode-Codierung und zwei, es brach für Filter mit mehreren gleichen keys (wie ein MultipleSelect widget). Wegen der .dict () - Konvertierung, alle Werte aber sind verloren. Meine version unterstützt unicode und mehrere mit dem gleichen key:
Dies schafft eine QueryDict kopieren, dann entfernt alle Schlüssel, die entsprechen, kwargs (seit update für eine QueryDict ergänzt, statt Sie zu ersetzen). Mark_safe nötig war, durch eine doppelte Codierung Problem.
Verwenden Sie es wie folgt aus (vergessen Sie nicht, laden Sie die tags):
wo ?p=1 ist unsere Seitenumbrüche syntax in der Ansicht.
InformationsquelleAutor der Antwort Apollo Data