【问题标题】:Django url template with query parameters带有查询参数的 Django url 模板
【发布时间】:2018-12-24 19:46:19
【问题描述】:

我试图通过我的视图将查询参数传递到一个链接中,但它让我不知道如何以一种好的方式实际实现这一点。

我的模板如下:

<a class="link-button" href="{% url 'videos:index' %}?tag={{ tag }}&page={{ next }}">Next</a>

这会返回我想要的:

http://127.0.0.1:8000/videos/?tag=1&page=2

虽然这可行,但它非常脆弱,无法处理 None 值,必须有更好的方法来做到这一点。

我试图通过 urltemplate 标记传递它,但它似乎不是我想要的,因为它需要更改路径的 url 配置:

{% url 'videos:index' page=next tag=tag %}

有没有一种实际的方法或者我可以使用模板标签来获取参数?我尝试搜索此内容,但它给了我很多旧结果和更多路径 URL,例如:/videos/page-1/tag-1/ 我不是在寻找。

我希望做类似的事情:

<a href="{% url 'videos:index'}?{% params page=next tag=tag %}">Next</a>

【问题讨论】:

  • 没有内置这样的标签,但没有什么可以阻止你写一个。
  • @DanielRoseman 你不能用urlencode吗?

标签: django django-templates


【解决方案1】:

没有内置支持,但您可以自己添加一个。例如,您可以定义以下模板标签。例如,我们可以用粗体字构建文件:

app/
    templatetags/
        __init__.py
        urlparams.py

urlparams.py 中,我们定义:

from django import template
from urllib.parse import urlencode

register = template.Library()

@register.simple_tag
def urlparams(*_, **kwargs):
    safe_args = {k: v for k, v in kwargs.items() if v is not None}
    if safe_args:
        return '?{}'.format(urlencode(safe_args))
    return ''

在模板中,我们可以加载模板标签,然后像这样使用:

{% load urlparams %}

<a href="{% url 'videos:index'}{% urlparams page='1' tag='sometag' %}">Next</a>

请注意,严格来说,URL 参数可以包含多次 same 键。这是这里不可能。因此我们无法生成所有可能的 URL 参数,但这通常很少见,而且我认为一开始就不是一个好主意。

【讨论】:

  • 谢谢,不过必须改用from urllib.parse import urlencode。 Python 3.x
  • @Bjarte:感谢您的反馈。现在已更新(因为无论如何在 1.5 年内将不再支持 Python-2.x)[
  • 注意:目录命名准确很重要templatetags
  • @Flimm:这只对一个参数进行编码。此外,请注意,键也可以包含应该转义的字符。因此它不能解决问题。
  • @WillemVanOnsem 当您使用文字作为参数名称时,您不需要传递 urlencode,就像在原始问题中一样。此外,如果您使用变量作为参数名称,您可以使用 urlencode 作为参数名称。看我的回答。
【解决方案2】:

您可以使用 default template filter 并更新您的示例

<a class="link-button" href="{% url 'videos:index' %}?tag={{ tag|default:'' }}&page={{ next|defaul:'' }}">Next</a>

空标签和页面的输出是:

http://127.0.0.1:8000/videos/?tag=&page=

但如果您不想在 url 中打印 None Tag,则必须使用您自己的模板标签或过滤器。只需您可以编写此模板过滤器

@register.filter
def print_query_param(value, key)
   if value and key:
       return "%s=%s&" % (key, value)

你可以像下面这样使用它

<a class="link-button" href="{% url 'videos:index' %}?{{ tag|print_query_param:'tag' }}{{ next|print_query_param:'page' }}">Next</a>

【讨论】:

    【解决方案3】:

    模板标签urlencode

    使用模板标签urlencode:

    <a href="example?tag={{ tag|urlencode }}&page={{ next|urlencode }}">example</a>
    

    小记:

    请注意,不需要通过urlencode 传递参数名称本身,因为在这种情况下它们是文字。如果参数名称不是文字,您需要像这样:

    &lt;a href="example?{{ name1|urlencode }}={{ value1|urlencode }}&amp;{{ name2|urlencode }}={{ value2|urlencode }}"&gt;example&lt;/a&gt;

    【讨论】:

    • 这不会对参数名称进行urlencode,参数名称也可以包含不允许的字符。
    • @WillemVanOnsem 在这种情况下不需要,因为文字 tag 和文字 page 不能包含不允许的字符,因为我们知道字符 tagpge 都是允许的字符。查看我的编辑。
    猜你喜欢
    • 2019-12-07
    • 2020-05-02
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多