具有查询参数的Django URL模板

时间:2018-07-17 07:38:02

标签: django django-templates

我正在尝试通过视图将查询参数传递到链接中,但是它使我无法真正有效地实现此目的。

我的模板如下:

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

3 个答案:

答案 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>