È possibile passare parametri di query tramite il tag template {% url%} di Django?


117

Vorrei aggiungere parametri di richiesta a un {% url %}tag, come ?office=foobar.

È possibile? Non riesco a trovare niente su di esso.


Vedi questa risposta per un semplice tag modello personalizzato per il rendering delle stringhe di query.
Christian Long

Risposte:


169

No, perché i parametri GET non fanno parte dell'URL.

Aggiungili semplicemente alla fine:

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

Per Django 1.5+

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

10
Beh, tecnicamente lo sono. Secondo RFC 1738 , un URL HTTP assume la forma: http: // <host>: <port> / <path>? <searchpart>.
naktinis

@naktinis Un URL HTTP, sì. Un URL Django, non tanto . Quindi, per varie definizioni di "URL", avete entrambi ragione: P

Questo non fa sì che la barra finale interrompa l'URL, come example.com/myview/?office=foobarinvece di example.com/myview?office=foobar?
Al Sweigart

Sì ma allora cosa?
Daniel Roseman

34

Un modo per mescolare i parametri attuali con quelli nuovi:

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

Modifica le tue impostazioni per avere la variabile di richiesta:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

1
Purtroppo questo non sembra funzionare con parametri che sono elenchi
Arthur

@ Arthur Is it Djangos bug?
eri

3
sarebbe davvero elegante, ma non funziona per il paging in quanto aggiunge anche la "pagina = 1" della pagina precedente dai parametri GET.
Florian

25

Utilizzare urlencodese l'argomento è una variabile

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

oppure caratteri speciali come gli spazi potrebbero interrompere il tuo URL.

Documentazione: https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#urlencode


Questo non funziona per me .. la some_varvariabile restituisce vuota in href ma si mostra riempita se usata altrove nel modello. v2.1
geoidesic

@geoidesic grazie per il rapporto, fammi sapere se trovi ulteriori note di rilascio del commit / versione in violazione, o riesci a riprodurre su 1.9.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

8

Innanzitutto, una risposta sciocca:

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

Una risposta seria: No, non puoi. Il risolutore di URL di Django corrisponde solo alla parte del percorso dell'URL, quindi il {% url %}tag può invertire solo quella parte dell'URL.


Infatti. Anche questo ha senso ... Vorrei solo che fosse un po 'più elegante di così.
Brian D

Puoi sempre scrivere un tag personalizzato più elegante, ad esempio {% qpurl myview office = foobar%}. Questo potrebbe anche elaborare i valori e codificarli in modo appropriato.
Spacedman

0

Prova questo:

{% url 'myview' office=foobar %}

Ha funzionato per me. Fondamentalmente fa il contrario su quel collegamento e applica gli argomenti forniti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.