无法使用 % 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的主要内容,如果未能解决你的问题,请参考以下文章