带有查询参数的 Django url 模板

Posted

技术标签:

【中文标题】带有查询参数的 Django url 模板【英文标题】:Django url template with query parameters 【发布时间】: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吗? 【参考方案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 都是允许的字符。查看我的编辑。

以上是关于带有查询参数的 Django url 模板的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将查询参数传递给 Django % url % 模板标签?

Django 模板标签插入或替换 URL 参数

使用表单在 django 模板中传递 url 参数

在 Django URL 模板标签内使用语义 UI 的查询结果

测试字符串是不是与带有参数的 django url 匹配

带有可变 django 模板的动态 URL