Est-il possible de transmettre des paramètres de requête via la balise template {% url%} de Django?


117

J'aimerais ajouter des paramètres de requête à une {% url %}balise, comme ?office=foobar.

Est-ce possible? Je ne trouve rien dessus.


Consultez cette réponse pour une balise de modèle personnalisée simple pour afficher les chaînes de requête.
Christian Long

Réponses:


169

Non, car les paramètres GET ne font pas partie de l'URL.

Ajoutez-les simplement à la fin:

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

Pour Django 1.5+

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

10
Eh bien, techniquement, ils le sont. Selon RFC 1738 , une URL HTTP prend la forme: http: // <host>: <port> / <path>? <searchpart>.
naktinis

@naktinis Une URL HTTP, oui. Une URL Django, pas tellement . Donc, pour diverses définitions de "URL", vous avez tous les deux raison: P

Cela ne signifie-t-il pas que la barre oblique de fin interrompt l'url, comme example.com/myview/?office=foobarau lieu de example.com/myview?office=foobar?
Al Sweigart

Oui mais alors quoi?
Daniel Roseman

34

Une façon de mélanger les paramètres actuels avec de nouveaux:

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

Modifiez vos paramètres pour avoir une variable de requête:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

1
Malheureusement, cela ne semble pas fonctionner avec des paramètres qui sont des listes
Arthur

@Arthur Est-ce le bug de Djangos?
eri

3
ce serait élégant en effet, mais ne fonctionne pas pour la pagination car il ajoute également la "page = 1" de la page précédente à nouveau à partir des paramètres GET.
Florian le

25

À utiliser urlencodesi l'argument est une variable

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

ou bien des caractères spéciaux tels que des espaces peuvent casser votre URL.

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


Cela ne fonctionne pas pour moi .. la some_varvariable retourne vide dans le href mais est indiquée comme étant remplie si elle est utilisée ailleurs dans le modèle. v2.1
geoidesic

@geoidesic merci pour le rapport, faites-moi savoir si vous trouvez plus loin les notes de version de validation / version de rupture, ou parvenez à reproduire sur 1.9.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

8

Tout d'abord, une réponse idiote:

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

Une réponse sérieuse: non, vous ne pouvez pas. Le résolveur d'URL de Django correspond uniquement à la partie chemin de l'URL, ainsi la {% url %}balise ne peut inverser que cette partie de l'URL.


En effet. Cela a du sens aussi ... Je souhaite juste que ce soit un peu plus élégant que cela.
Brian D

Vous pouvez toujours écrire une balise personnalisée plus élégante - {% qpurl myview office = foobar%} par exemple. Cela pourrait également traiter les valeurs et les encoder de manière appropriée.
Spacedman le

0

Essaye ça:

{% url 'myview' office=foobar %}

Cela a fonctionné pour moi. Il fait essentiellement un retour sur ce lien et applique les arguments donnés.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.