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


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

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

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


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.