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

117

Ich möchte einem {% url %}Tag Anforderungsparameter hinzufügen , z ?office=foobar.

Ist das möglich? Ich kann nichts darauf finden.

Brian D.
quelle
In dieser Antwort finden Sie ein einfaches benutzerdefiniertes Vorlagen-Tag zum Rendern von Abfragezeichenfolgen.
Christian Long

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">
Daniel Roseman
quelle
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',
)
eri
quelle
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

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
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.

lqc
quelle
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.

Edward Codarcea
quelle