基本上尝试做
{% 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"
%}
由此我可以看出参数不能是上下文变量,因此下一步可以尝试像在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
是标题,我希望xxx
是title_text
,如果它是个人资料,我希望它是user
。
参数名称保存在belongs_to
中,因此,如果这是常规的python函数,我可以简单地完成
url(url_variable, **{belongs_to: value})
,它将使用正确的参数名称解压缩它。所以我需要在模板处理器中实现这种效果
答案 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。