使用参数找到 Django 反向 url,但使用关键字失败
Posted
技术标签:
【中文标题】使用参数找到 Django 反向 url,但使用关键字失败【英文标题】:Django reverse url found with arguments but fails with keywords 【发布时间】:2014-07-23 19:07:23 【问题描述】:这是关于错误的另一个问题:
Reverse for 'dataPoints' with arguments '()' and keyword arguments 'u'loadID': 5' not found. 1 pattern(s) tried: [u'loads/dataPoints/']
我已经筛选了大量相关帖子,但似乎无法弄清楚发生了什么。问题是这样的:在使用 url 命名空间的应用程序中,当我尝试将关键字参数传递给 url 时,视图模板会失败并出现上述错误,但如果我使用位置参数则可以。
这就是给我上述错误的原因:
***urls.py:
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
...
url(r'^loads/', include(sig.views.data_loads.urls_data_loads, namespace="loads")),
url(r'^authentication/', include(sig.views.authentication.urls_authentication, namespace="authentication")),
url(r'^account/', include(sig.views.account.urls_account, namespace="account")),
)
用于“加载”的 urls.py:
urlpatterns = patterns('',
url(r'^dataPoints', views.DataPoints.as_view(), name='dataPoints')
)
模板.html:
<a href="% url 'loads:dataPoints' loadID=5 %">points</a>
然后它说它找不到相反的东西。根据我发现的一些相关线程,我尝试过: - 尝试不带引号的链接,即 % url loading:dataPoints ... %(失败) - 尝试了不同的正则表达式模式,例如url(r'^dataPoints(.)*) (还是找不到反向)
我可以通过使用位置参数轻松解决这个问题,但我无法弄清楚这真的让我很烦恼。我以前在应用程序中使用过这样的关键字 args,我想知道是否因为我使用的是 url 命名空间而出现问题?要么,或者更有可能,我正在做一些完全愚蠢的事情。
编辑:为 DataPoints 视图添加代码:
class DataPoints(TemplateView):
template_name = "data_loads/templates/dataPoints.html"
def get(self, request):
loadID = request.GET["loadID"]
return self.render_to_response()
【问题讨论】:
您是否要覆盖视图DataPoint
的默认__init__
?可以贴一下视图的代码吗?
不,我不认为我在那里做任何时髦的事情。我编辑了帖子以包含 DataPoints 视图的代码,它现在只是一个骨架。
【参考方案1】:
urlpatterns = patterns('',
url(r'^dataPoints', views.DataPoints.as_view(), name='dataPoints')
)
您修改后的网址不带任何参数,因为之前的网址带loadID
。
所以你看到的行为是正确的。
要使用 kwargs,请保持您的 url 不变并像您一样使用模板
<a href="% url 'loads:dataPoints' loadID=5 %">points</a>
【讨论】:
另一个 url 没有在模式中指定参数但是 r'^dataPoints' 应该匹配 "dataPoints?load=5" 不是吗?我认为只有当我有 r'^dataPoints$' 时才会有问题。但无论如何,我已经尝试过这个正则表达式的排列,就像我在问题中列出的示例 r'^dataPoints(.)*'。 @Gadzooks34,不,那不正确。使用r'^dataPoints'
,您告诉我们没有参数。所以%url ..%
用 kwargs 指定时不会找到它。
但是那会是什么样子呢? "r'^dataPoints?loadID=[0-9]+$"?我从未见过有人这样做。 (它也不起作用)。是否有其他方式表明您在 url 中期待 args?
@Gadzooks34,Django url 解析器不解析 url 中的参数,参考:docs.djangoproject.com/en/dev/topics/http/urls/…
对,但这不是为什么我的原始模式 r'^dataPoints' 应该工作的另一个论点吗?我也试过像 r'^dataPoints/?$' 这样的东西。您介意发布您认为正确的正则表达式应该是什么吗?【参考方案2】:
我正在考虑您对 Rohans 的回答。
模式r'^dataPoints'
将匹配任何以'dataPoints' 开头的url,包括dataPoints?load=5
,但'load' 将被添加到request.GET(所以request.GET['load']
是'5')。这就是您从未见过有人做类似r'^dataPoints?loadID=[0-9]+$
之类的事情的原因,因为这不是 url 模式的工作方式。 Rohans 在这里的原始答案是正确的,您只需在 urls.py 中恢复为“加载”的原始模式。如果错误消失,您应该尝试他的建议并接受他的回答,我相信它会。
【讨论】:
非常感谢您和 Rohan 的帮助。我完全同意你的评论。但是,除非我遗漏了什么,否则 Rohan 的建议是完全按照我最初的做法去做(我已经恢复到它,但它仍然会重复产生错误)。我对不寻常的正则表达式的评论是对他的断言的回应,“使用 r'^dataPoints' 你是在告诉没有参数......”这仍然让我感到困惑。由于我得到了与我最初的理解相匹配的一致反馈,我想我需要开始寻找奇怪的命名空间冲突之类的东西。【参考方案3】:好的 - 我知道这对我来说一定是愚蠢的。我假设 url 调度上下文中的“关键字参数”是指 GET 参数,而不是路由到 get() 方法的关键字参数。这也是为什么我对提到方法签名的 cmets 感到如此困惑的原因。啊。非常愚蠢,但希望这会帮助其他犯同样错误的人。无论如何,最终的答案是我的模板文件中的行应该是:
<a href="% url 'loads:dataPoints' %?loadID=5">points</a>
最终引起我点击的帖子是this one。谢谢大家,你们的帮助。
【讨论】:
以上是关于使用参数找到 Django 反向 url,但使用关键字失败的主要内容,如果未能解决你的问题,请参考以下文章