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