无法使用 % url % 模板标签正确生成带有捕获参数的 URL

Posted

技术标签:

【中文标题】无法使用 % url % 模板标签正确生成带有捕获参数的 URL【英文标题】:Cannot properly generate URL with captured arguments using % url % template tag无法使用 % url % 模板标签正确生成带有捕获参数的 URL 【发布时间】:2014-10-10 16:47:24 【问题描述】:

我在通过模板标签提供捕获的 URL 参数时遇到了问题。我有一个带有捕获参数的 URL 调度,该参数传递给另一个没有任何捕获参数的带有 include() 的 URL 调度:

nodemanager.urls: url(r'^(?P<node_id>\d+)/rank/', include('ranking.urls')),

ranking.urls: url(r'^setup$', views.setup, name='setup'),

我在我的模板中使用了% url 'setup' node_id=node.id %,这会产生错误:

/stage1/node/5/rank/setup 处的类型错误

setup() 得到了一个意外的关键字参数“node_id”

如果我取出关键字参数并只使用:% url 'setup' %,则登录页面无法加载并且我收到(可预测的)错误:

/stage1/ 处的 NoReverseMatch

未找到带有参数“()”和关键字参数“”的“设置”的反向操作。 1 个模式 > 已尝试:['stage1/node/(?P\d+)/rank/setup$']

我知道我需要提供node_id 的参数才能正确反转 URL。但是,我的排名应用程序中的命名 url “setup”不带任何参数,但包含它的 URL(在 nodemanager 应用程序中)可以。

如何使用指向stage1/node/5/rank/setup 的模板标签正确传递node_id 关键字参数,即% url 'setup' ... % 形式的东西。我可以这样做吗?

如果我需要发布更多上下文代码,请告诉我;我试图包括(我认为的)相关部分。

【问题讨论】:

视图是如何定义的? % url 'ranking:setup' % @rajasimon 没有命名空间,所以这可能行不通。 【参考方案1】:

最初的错误不是由于 URL 反转,而是在实际调用视图时出现。这可能是因为您没有声明它采用 node_id 参数。应该是这样的:

def setup(request, node_id):
    ...

一旦你解决了这个问题,原来的 url 标签语法应该可以工作了。

【讨论】:

这确实有效!我试图再次阅读documentation 并发现“包含的 URLconf 接收来自父 URLconfs 的任何捕获的参数”。这不违背 Django 松耦合应用程序的理念吗?如果我使用的是第三方评论应用(例如),我是否也必须更改其视图的源代码? 不,因为您只会对期望它的应用程序执行此操作。如果您不想将 node_id 传递给包含的 urlconf,则不要将其包含在执行包含的模式中。

以上是关于无法使用 % url % 模板标签正确生成带有捕获参数的 URL的主要内容,如果未能解决你的问题,请参考以下文章

生成带有和不带有 HTML 标签的相同文本?

使用带有特殊字符的 Django 的 url 模板标签

Django 模板未正确格式化 <pre> 标签

django url 模板标签的问题,% url %

如何在 Django 模板中使用带有外键对象的 get_absolute_url()

Python url模板标签只给出了绝对url的一部分.. ..一定是睡眠不足