¿Es posible pasar parámetros de consulta a través de la etiqueta de plantilla {% url%} de Django?

117

Me gustaría agregar parámetros de solicitud a una {% url %}etiqueta, como ?office=foobar.

es posible? No encuentro nada en él.

Brian D
fuente
Consulte esta respuesta para obtener una etiqueta de plantilla personalizada simple para representar cadenas de consulta.
Christian Long

Respuestas:

169

No, porque los parámetros GET no forman parte de la URL.

Simplemente agréguelos al final:

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

Para Django 1.5+

<a href="{% url 'myview' %}?office=foobar">
Daniel Roseman
fuente
10
Bueno, técnicamente lo son. Según RFC 1738 , una URL HTTP tiene la forma: http: // <host>: <port> / <path>? <searchpart>.
naktinis
@naktinis Una URL HTTP, sí. Una URL de Django, no tanto . Entonces, para varias definiciones de "URL", ambos están en lo correcto: P
¿No da como resultado que la barra inclinada final interrumpa la URL, como en example.com/myview/?office=foobarlugar de example.com/myview?office=foobar?
Al Sweigart
Sí, pero ¿y qué?
Daniel Roseman
34

Una forma de mezclar los parámetros actuales con uno nuevo:

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

Modifique su configuración para tener una variable de solicitud:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)
eri
fuente
1
Desafortunadamente, esto no parece funcionar con parámetros que son listas
Arthur
@Arthur ¿Es un error de Djangos?
eri
3
eso sería realmente elegante, pero no funciona para la paginación, ya que también agrega la "página = 1" de la página anterior nuevamente desde los parámetros GET.
Florian
25

Usar urlencodesi el argumento es una variable

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

De lo contrario, los caracteres especiales como los espacios podrían romper su URL.

Documentación: https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#urlencode

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
Esto no funciona para mí ... la some_varvariable vuelve vacía en el href pero se muestra que está llena si se usa en otra parte de la plantilla. v2.1
geoidesic
@geoidesic gracias por el informe, avíseme si encuentra más las notas de lanzamiento de última versión / compromiso, o logra reproducir en 1.9.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
8

Primero, una respuesta tonta:

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

Una respuesta seria: No, no puedes. El solucionador de URL de Django solo coincide con la parte de la ruta de la URL, por lo que la {% url %}etiqueta solo puede revertir esa parte de la URL.

lqc
fuente
En efecto. Eso también tiene sentido ... Solo desearía que fuera un poco más elegante que eso.
Brian D
Siempre puede escribir una etiqueta personalizada más elegante, por ejemplo, {% qpurl myview office = foobar%}. Esto también podría procesar los valores y codificarlos adecuadamente.
Spacedman
0

Prueba esto:

{% url 'myview' office=foobar %}

Funcionó para mí. Básicamente, hace un revés en ese enlace y aplica los argumentos dados.

Edward Codarcea
fuente