Django模板上的URL编码

时间:2013-01-27 12:48:54

标签: html django django-templates url-encoding

我有这个锚链接:

<a href="/question/tag/1/1/?list_id={{title}}">{{title}}</a>

有时,这个标题有一些内容+(添加运算符),如: “Django + Python”

但是当它直接放在锚链接上时,提供的网址将是:

http://127.0.0.1:8080/question/tag/1/1/?list_id=Django + Python

这将最终导致检索问题,因为url解码器认为list_id GET = DjangoPython。

那么,有谁知道如何避免这个问题?请注意,我不想将锚链接更改为输入按钮。

2 个答案:

答案 0 :(得分:52)

而不是

{{ title }}

{{title|urlencode}}

答案 1 :(得分:-1)

不是通过连接标题上下文项来硬编码URL并在模板中构建查询字符串,而是考虑使用django.core.urlresolvers.reverse()并从相关的urls.py文件中指定命名URL来简化它。 。当您不必担心URL更改时,可以实现干净的设计!想象一下,您必须更改所有分散的HREF的头痛,而不是简单地将视图集中的上下文变量分配给反向调用的结果。查询字符串也可以在视图中很好地添加,而不必担心一些常常奇怪的模板解析规则。请注意,urllib.urlencode函数与同名模板过滤器的行为完全不同;不要混淆!它可以使用如下:

# If the entry in URLConf has named capture groups such as ?<pk>,
# pass a dict as kwargs parameter instead.
url = reverse('your-named-url', args=(1, 1))  # e.g '/question/tag/1/1/'
# Encodes as form data to 'list_id=Django+%2B+Python'
querystring = urllib.urlencode({'list_id': 'Django + Python'})
context['question_url'] = '{}?{}'.format(url, querystring)

然后,在模板中,它可以像href="{{ question_url }}"一样简单。这似乎更多的工作,但它可以很快得到回报,这是一个更好的关注点分离。通常我会使用{% url "your-named-url" %}模板标签,但它目前不能很好地处理查询字符串 - 就像在处理URLConf中定义的URL args和kwargs一样。