是否可以通过Django的{%url%}模板标记传递查询参数?


Answers:


169

不可以,因为GET参数不是URL的一部分。

只需将它们添加到末尾即可:

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

对于Django 1.5+

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

10
好吧,从技术上讲,它们是。根据RFC 1738,HTTP URL的格式为:http:// <主机>:<端口> / <路径>?<searchpart>。
naktinis 2012年

@naktinis是一个HTTP URL。Django URL,不是很多。因此,对于“ URL”的各种定义,您都是正确的:P

难道这不是结果结尾的斜线中断网址,例如example.com/myview/?office=foobar代替example.com/myview?office=foobar
艾维格

是的,那又如何呢?
丹尼尔·罗斯曼

34

一种将当前参数与新参数混合的方法:

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

修改您的设置以包含请求变量:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

1
不幸的是,这似乎不适用于列表参数
Arthur

@Arthur是Django的错误吗?
ERI

3
确实很优雅,但不适用于分页,因为它还会从GET参数中再次添加上一页的“ page = 1”。
Florian 2015年

25

使用urlencode如果该参数是一个变量

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

否则空格等特殊字符可能会破坏您的网址。

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


这对我不起作用.. some_var变量在href中返回空,但如果在模板的其他地方使用,则显示为已填充。v2.1
geoidesic '18

@geoidesic感谢您的报告,让我知道您是否进一步找到了突破性的提交/版本发行说明,或者设法在1.9上重现。
Ciro Santilli郝海东冠状病六四事件法轮功

8

首先,一个愚蠢的答案:

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

一个严重的答案:不,你不能。Django的URL解析器仅匹配URL的路径部分,因此{% url %}标记只能反转URL的该部分。


确实。这也很有道理...我只希望它比这更优雅。
Brian D

您总是可以编写更优雅的自定义标签-例如{%qpurl myview office = foobar%}。这也可以处理这些值并对其进行适当编码。
Spacedman 2011年

0

试试这个:

{% url 'myview' office=foobar %}

它为我工作。它基本上在该链接上执行反向操作并应用给定的参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.