使用参数找到 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,但使用关键字失败的主要内容,如果未能解决你的问题,请参考以下文章

接收错误:使用参数“()”和未找到关键字参数反向

Django:未找到反向URL模式

反向解析与重定向 | Django开发

没有反向匹配 - django.urls.exceptions.NoReverseMatch

Django之URL反向解析

Django 错误:“image_upload”的反向,没有找不到参数?