¿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.


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">

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',
)

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


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.