33

我有这个锚链接:

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

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

但是当它直接放在锚链接上时,传递的url会是:

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

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

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

4

2 回答 2

83

代替

{{ title }}

{{title|urlencode}}
于 2013-01-27T13:14:38.237 回答
-2

与其硬编码 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 的方式不同。

于 2014-02-06T03:31:28.080 回答