我有这个锚链接:
<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。
那么,有谁知道如何避免这个问题?请注意,我不想将锚链接更改为输入按钮。
答案 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一样。