É possível passar parâmetros de consulta por meio da tag de modelo {% url%} do Django?

117

Eu gostaria de adicionar parâmetros de solicitação a uma {% url %}tag, como ?office=foobar.

Isso é possível? Não consigo encontrar nada nele.

Brian D
fonte
Veja esta resposta para uma tag de template customizada simples para renderizar strings de consulta.
Christian Long

Respostas:

169

Não, porque os parâmetros GET não fazem parte do URL.

Basta adicioná-los ao final:

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

Para Django 1.5+

<a href="{% url 'myview' %}?office=foobar">
Daniel Roseman
fonte
10
Bem, tecnicamente eles são. De acordo com a RFC 1738 , um URL HTTP assume a forma: http: // <host>: <port> / <path>? <searchpart>.
naktinis
@naktinis Um URL HTTP, sim. Uma URL do Django, nem tanto . Portanto, para várias definições de "URL", ambos estão corretos: P
Isso não resulta em uma barra final interrompendo o url, como em example.com/myview/?office=foobarvez de example.com/myview?office=foobar?
Al Sweigart
Sim, mas e daí?
Daniel Roseman
34

Uma maneira de misturar os parâmetros atuais com os novos:

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

Modifique suas configurações para ter uma variável de solicitação:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)
eri
fonte
1
Infelizmente, isso não parece funcionar com parâmetros que são listas
Arthur
@Arthur É bug do Djangos?
eri
3
isso seria elegante de fato, mas não funciona para paginação, pois também adiciona "page = 1" da página anterior novamente a partir dos parâmetros GET.
Florian,
25

Use urlencodese o argumento for uma variável

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

ou então, caracteres especiais como espaços podem quebrar seu URL.

Documentação: https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#urlencode

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fonte
Isso não funciona para mim .. a some_varvariável retorna vazio no href, mas é mostrado para ser preenchida se usada em outro lugar no modelo. v2.1
geoidesic
@geoidesic obrigado pelo relatório, deixe-me saber se você encontrar mais detalhes sobre o commit / release da versão, ou conseguir reproduzir no 1.9.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
8

Primeiro, uma resposta boba:

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

Uma resposta séria: Não, você não pode. O resolvedor de URL do Django corresponde apenas à parte do caminho da URL, portanto, a {% url %}tag só pode reverter essa parte da URL.

lqc
fonte
De fato. Isso também faz sentido ... Eu só queria que fosse um pouco mais elegante do que isso.
Brian D
Você sempre pode escrever uma tag personalizada mais elegante - {% qpurl myview office = foobar%} por exemplo. Isso também pode processar os valores e codificá-los adequadamente.
Spacedman
0

Experimente isto:

{% url 'myview' office=foobar %}

Funcionou para mim Basicamente, ele faz uma reversão nesse link e aplica os argumentos fornecidos.

Edward Codarcea
fonte