Django反向URL通过参数找到但通过关键字失败

1 投票
3 回答
1091 浏览
提问于 2025-04-18 08:24

这是另一个关于错误的问题:

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")),
)

“loads”的 urls.py 文件:

urlpatterns = patterns('',
    url(r'^dataPoints', views.DataPoints.as_view(), name='dataPoints')
)

template.html 文件:

<a href="{% url 'loads:dataPoints' loadID=5 %}">points</a>

然后它说找不到反向匹配。根据我找到的一些相关讨论,我尝试了:
- 不加引号尝试链接,比如 {% url loads:dataPoints ... %}(结果失败)
- 尝试不同的正则表达式模式,比如 url(r'^dataPoints(.)*)(还是找不到反向匹配)

我可以通过使用位置参数轻松解决这个问题,但我真的很烦恼为什么搞不定。我以前在应用中用过这样的关键字参数,我在想是不是因为我在使用 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({})

3 个回答

1
urlpatterns = patterns('',
    url(r'^dataPoints', views.DataPoints.as_view(), name='dataPoints')
)
<a href="{% url 'loads:dataPoints' loadID=5 %}">points</a>

你修改后的网址没有像之前那样带任何参数,之前的网址是带有loadID这个参数的。

所以你现在看到的情况是正常的。

如果想使用关键字参数(kwargs),保持你的网址不变,继续像现在这样使用模板就可以了。

1

我在考虑你们对Rohan回答的评论。

这个模式 r'^dataPoints' 会匹配任何以 'dataPoints' 开头的链接,包括 dataPoints?load=5。在这种情况下,'load' 会被加入到请求的参数中(所以 request.GET['load'] 的值就是 '5')。这就是为什么你从来没有看到过像 r'^dataPoints?loadID=[0-9]+$ 这样的写法,因为这不是网址模式的工作方式。Rohan 最初的回答是对的,你只需要把 urls.py 中的 'load' 恢复到原来的模式。你应该试试他建议的方法,如果错误消失了,就接受他的回答,我相信它会有效的。

1

好的,我知道这肯定是我自己的问题。我原本以为在网址分发的上下文中,“关键字参数”是指GET参数,而不是传递给get()方法的关键字参数。这也是我为什么对提到方法签名的评论感到困惑的原因。唉,真是有点傻,但希望这能帮助到其他犯同样错误的人。总之,我模板文件中的那行应该是:

<a href="{% url 'loads:dataPoints' %}?loadID=5">points</a>

让我终于明白这一点的帖子是 这一篇。谢谢大家的帮助。

撰写回答