带有查询参数的 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
值,必须有更好的方法来做到这一点。
我试图通过 url
template 标记传递它,但它似乎不是我想要的,因为它需要更改路径的 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
传递参数名称本身,因为在这种情况下它们是文字。如果参数名称不是文字,您需要像这样:
<a href="example? name1|urlencode = value1|urlencode & name2|urlencode = value2|urlencode ">example</a>
【讨论】:
这不会对参数名称进行urlencode,参数名称也可以包含不允许的字符。 @WillemVanOnsem 在这种情况下不需要,因为文字tag
和文字 page
不能包含不允许的字符,因为我们知道字符 t
、a
、g
、p
、g
和 e
都是允许的字符。查看我的编辑。以上是关于带有查询参数的 Django url 模板的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将查询参数传递给 Django % url % 模板标签?