【问题标题】:URL encoding on Django TemplateDjango 模板上的 URL 编码
【发布时间】:2013-01-10 22:23:32
【问题描述】:

我有这个锚链接:

<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。

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

【问题讨论】:

  • 那么,你想要什么?将"Django + Python" 作为list_id 值发送?
  • 是的,我想将 + 编码为 %2B
  • 您的网址没有问题。您是如何在视图中实现它的?
  • 谢谢大家,我找到了答案

标签: html django django-templates url-encoding


【解决方案1】:

代替

{{ title }}

{{title|urlencode}}

【讨论】:

    【解决方案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 的方式不同。

    【讨论】:

    • 这个回复没有回答问题,推荐的有用性值得怀疑:在上下文变量中隐藏 URL 结构并不总是一个好主意。
    • 我认为@jdtohs 答案完成了这个答案试图做的所有事情——即它使用模板中的变量,然后使用模板过滤器对字符串进行编码。在标记下,我真的试图让另一个答案超越这个!
    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2010-10-03
    • 2012-11-29
    • 2012-11-07
    相关资源
    最近更新 更多