【问题标题】:Django dynamic url parameter namesDjango 动态 url 参数名称
【发布时间】:2019-08-22 02:59:01
【问题描述】:

基本上是在尝试做

    {%  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 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})

它会用正确的参数名称解​​压它。所以我需要在模板处理器中对此进行某种等效

【问题讨论】:

  • 您根本不需要 URL 模式元素。您需要查询字符串,例如/dynamic_url/?belongs_to=foo&amp;the_title=bar 等。
  • 否,因为我试图链接到的 profiletitle 页面中涉及不同的 html。 get 参数确实用于其他过滤,但我有 3 个主要模型usertitleentry,它们都有各自的 url 和模板。入口模型显示在每一个中,但页脚根据基本 url 和 get 参数而变化。
  • 我完全不明白为什么这与我所说的相矛盾。
  • 使用/title/?title=some-title 而不是/title/some-title/ 会不会很荒谬,或者我不明白
  • 我完全听不懂你在说什么。为什么要复制“标题”?您希望您的完整 URL 是什么样的? (那包含标签与什么有什么关系?)

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


【解决方案1】:

我认为你把事情复杂化了。你自己没有展示你的观点,但我不明白为什么他们不能都采用一个通用命名的参数——比如,param——它可以完成特定的工作。所以 URL 可能是:

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

【讨论】:

  • 如果我需要像这样反转超过 4-5 个 url,我认为这有点不可读,但我想这是迄今为止最好的方法,令人不安的是 django 模板没有这样的一个简单的功能,比如在标签 kwargs 中解包地图。
【解决方案2】:

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

【讨论】:

  • 如果我错了,请纠正我,但是 {% dynamic_url urlname some(1)=some(2) thing=thing %} some(1) 在这种情况下也将是文字 "some" 并且不会呈现为值,因此我仍然需要硬编码参数名称。我想要的是能够引用 path('myurl/&lt;str:some&gt;/&lt;str:thing&gt;', name='myurl') path('myurl/&lt;str:some2&gt;/&lt;str:thing2&gt;', name='myurl2') somesome2 而无需硬编码它们,而是使用名为 some_id 的上下文变量并执行 {% url urlname some_id=some thing_id=thing %} ,这在您的版本中仍然是不可能的。
  • 参数的数量是否从一个 url 变化到另一个?如果不是,为什么不像我的回答中的第一个示例那样传递它们?
  • 有带有可选参数的 url,所以我正在寻找一种通用的方法来处理这些,知道我只是在破解我的出路,但它令人不安
  • @IşıkKaplan 你能告诉我更多关于你的案例吗?您从哪里获取参数,为什么需要像这样反转 URL?
  • @IşıkKaplan 有什么消息吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2020-01-02
  • 2011-11-29
  • 1970-01-01
  • 2012-11-27
相关资源
最近更新 更多