Django动态网址参数名称

时间:2019-04-01 00:32:53

标签: python django python-3.x django-templates

基本上尝试做

    {%  url dynamic_url_name dynamic_parameter_name=dynamic_parameter_value %}

尝试了最简单的方法

<a href="{% url belongs_to belongs_to_url_arg=entry|getattribute:belongs_to_url_arg_value %}">{{entry}}</a>
    {% include 'mainsite/children/title_template.html' with
        the_title=title_text
        is_title_page=True
        entries_of="title"
        belongs_to="profile"
        belongs_to_url_arg="user"
        belongs_to_url_arg_value="author"
    %}

但是不幸的是,这导致了enter image description here的彻底失败

由此我可以看出参数不能是上下文变量,因此下一步可以尝试像在python内部那样简单地将字典解包

{% url **{dynamic_parameter_name:dynamic_parameter_value} %}

但是我不知道django模板内部是否可能,以及如何做到?


我的网址看起来像

re_path(r'^title/(?P<title_text>[a-zA-Z0-9-]+)/$', TitlePage.as_view(), name='title')
re_path(r'^user/(?P<user>[a-zA-Z0-9-]+)/$', ProfilePage.as_view() ,name='profile')

我的网址是通过上下文变量或包含标签选择的,因此它是一个变量。

{% url url_variable xxx=value %}

现在,url_variable已经是django的一部分,url标记接受变量作为它的第一个参数。但是xxx并不总是相同,而是在这种特殊情况下会根据url_variable进行更改;如果url_variable是标题,我希望xxxtitle_text,如果它是个人资料,我希望它是user。 参数名称保存在belongs_to中,因此,如果这是常规的python函数,我可以简单地完成

url(url_variable, **{belongs_to: value})

,它将使用正确的参数名称解​​压缩它。所以我需要在模板处理器中实现这种效果

2 个答案:

答案 0 :(得分:1)

我认为您太过复杂了。您尚未显示自己的视图,但我看不到为什么它们不能全部采用通用名称的参数-例如param-来完成特定的工作。因此网址可能是:

re_path(r'^title/(?P<param>[a-zA-Z0-9-]+)/$', TitlePage.as_view(), name='title')
re_path(r'^user/(?P<param>[a-zA-Z0-9-]+)/$', ProfilePage.as_view() ,name='profile')

现在您可以做

{% url dynamic_url_name param=dynamic_parameter_value %}

答案 1 :(得分:0)

**kwargs作为{% url %}标签的参数不被特别支持,但是有一些解决方法。

如果urlpatterns中的路径定义为:

path('myurl/<str:some>/<str:thing>', name='myurl')

那么您可以拥有一个filetoinclude.html

<a href="{% url urlname some thing %}">My Url</a>

然后在您的main.html中:

{% include 'filetoinclude.html' with urlname='myurl' some="aaa" thing="bbb" %}

渲染时,您将得到类似的东西:

<a href="localhost:8000/myurl/aaa/bbb">My Url</a>

但是很明显的问题是,当您反转URL时,您可能想解决URL的特定参数。因此,您可以创建如下模板标签:

from django.urls import reverse
from django import template

register = template.Library()


@register.simple_tag
def dynamic_url(urlname, **kwargs):
    return reverse(urlname, kwargs=kwargs)

,然后在您的filetoinclude.html中,您可以这样做:

{% load url_extended %}
{% dynamic_url urlname some=some thing=thing %}

将产生与以前相同的URL。