我正在尝试通过视图将查询参数传递到链接中,但是它使我无法真正有效地实现此目的。
我的模板如下:
<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>
答案 0 :(得分:4)
没有内置支持,但您可以自己添加一个。例如,您可以定义以下模板标签。例如,我们可以用黑体字构造文件:
mysqlclient
在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 ''
请注意,严格来说,URL参数可以多次包含 same 键。在这里不可能。因此我们无法生成所有可能的 URL参数,但这通常非常少见,我认为这并不是一个好主意。
答案 1 :(得分:1)
您可以使用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标签,则必须使用自己的模板标签或过滤器。只需编写此模板过滤器即可
@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>
答案 2 :(得分:-1)
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>