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.

Brian D
la source
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">
Daniel Roseman
la source
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',
)
eri
la source
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

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

lqc
la source
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.

Edward Codarcea
la source