Ist es möglich, Abfrageparameter über das Django-Vorlagen-Tag {% url%} zu übergeben?


Antworten:


169

Nein, da die GET-Parameter nicht Teil der URL sind.

Fügen Sie sie einfach am Ende hinzu:

<a href="{% url myview %}?office=foobar">

Für Django 1.5+

<a href="{% url 'myview' %}?office=foobar">

10
Nun, technisch sind sie. Gemäß RFC 1738 hat eine HTTP-URL die Form: http: // <Host>: <Port> / <Pfad>? <Suchteil>.
Naktinis

@naktinis Eine HTTP-URL, ja. Eine Django-URL, nicht so sehr . Für verschiedene Definitionen von "URL" sind Sie beide korrekt: P

Führt dies nicht dazu, dass der abschließende Schrägstrich die URL unterbricht, wie example.com/myview/?office=foobarstatt example.com/myview?office=foobar?
Al Sweigart

Ja aber na und?
Daniel Roseman

34

Eine Möglichkeit, aktuelle Parameter mit neuen zu verwechseln:

{% url 'order_list' %}?office=foobar&{{ request.GET.urlencode }}

Ändern Sie Ihre Einstellungen, um eine Anforderungsvariable zu erhalten:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)

1
Leider scheint dies nicht mit Parametern zu funktionieren, die Listen sind
Arthur

@ Arthur Ist es Djangos Bug?
Eri

3
Das wäre zwar elegant, funktioniert aber nicht für das Paging, da es auch die "Seite = 1" der vorherigen Seite erneut aus den GET-Parametern hinzufügt.
Florian

25

Verwenden Sie urlencodediese Option, wenn das Argument eine Variable ist

<a href="{% url 'myview' %}?office={{ some_var | urlencode }}">

Andernfalls können Sonderzeichen wie Leerzeichen Ihre URL beschädigen.

Dokumentation: https://docs.djangoproject.com/de/3.0/ref/templates/builtins/#urlencode


Dies funktioniert bei mir nicht. Die some_varVariable wird in der href leer zurückgegeben, wird jedoch als gefüllt angezeigt, wenn sie an anderer Stelle in der Vorlage verwendet wird. v2.1
geoidesic

@geoidesic, danke für den Bericht. Lassen Sie mich wissen, wenn Sie die aktuellen Versionshinweise zu Commit / Version weiter finden oder es schaffen, auf 1.9 zu reproduzieren.
Ciro Santilli 法轮功 冠状 病 六四 事件 30

8

Zunächst eine dumme Antwort:

{% url my-view-name %}?office=foobar

Eine ernsthafte Antwort: Nein, das kannst du nicht. Djangos URL Resolver entspricht nur den Pfad Teil der URL, so dass der {% url %}Tag nur den Teil der URL umkehren.


Tatsächlich. Das macht auch Sinn ... Ich wünschte nur, es wäre etwas eleganter.
Brian D

Sie können jederzeit ein eleganteres benutzerdefiniertes Tag schreiben, z. B. {% qpurl myview office = foobar%}. Dies könnte auch die Werte verarbeiten und entsprechend codieren.
Spacedman

0

Versuche dies:

{% url 'myview' office=foobar %}

Es hat bei mir funktioniert. Dieser Link wird im Grunde genommen umgekehrt und die angegebenen Argumente werden angewendet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.