10

在我的urls.py文件中,我有:

from myapp import views
...
(r'^categories/$', views.categories)

categories里面的视图函数在哪里myapp/views.py。没有其他 URLconf 行参考views.categories

在一个单元测试文件中,我试图使用 来获取这个 URL django.core.urlresolvers.reverse(),而不是仅仅复制 '/categories/' (DRY 和所有这些)。所以我有:

from django.core.urlresolvers import reverse
from myapp import views
...

url = reverse(views.categories)

当我运行我的测试时,我得到一个NoReverseMatch错误:

NoReverseMatch: Reverse for '<function categories at 0x1082f30>' with arguments '()' and keyword arguments '{}' not found.

如果我将 URL 模式设为命名模式,它匹配得很好,如下所示:

url(r'^categories/$', views.categories, 'myapp-categories')

并使用模式名称来匹配它:

url = reverse('myapp-categories')

但据我从文档中可以看出reverse不需要将其设为命名 URL 模式即可使用reverse

任何想法我做错了什么?

4

4 回答 4

2

Jack M. 的例子几乎是正确的。

如果要使用命名 url,它必须是 url 函数,而不是元组。

url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
于 2008-09-25T22:55:44.153 回答
2

经过进一步调查,事实证明这是我如何导入视图模块的问题:

如何成功地将函数引用传递给 Django 的 reverse() 函数?

不过,感谢您的帮助,伙计们:您启发了我正确看待它。

于 2008-09-28T19:56:18.793 回答
0

这确实有效,并且您粘贴的所有代码都是正确的并且工作正常(我只是将它复制到一个干净的测试/项目应用程序中,它反转了 URL 没有任何问题)。所以这里还有一些你没有向我们展示的东西。简化到最基本的基础直到它起作用,然后开始重新添加复杂性,看看它在哪里崩溃。

此外,您可以执行“./manage.py shell”,然后交互式地导入反向函数和您的视图函数并尝试反向。这将删除测试设置作为可能的原因。

于 2008-09-25T20:39:30.517 回答
-1

reverse 函数实际上使用了 URL 的“名称”。这是这样定义的:

urlpatterns = patterns('',
    (r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
    (r'^admin/(.*)', admin.site.root),
)

现在您将使用字符串“no-monkeys”调用 reverse 以获取正确的 url。

Ninja Edit: 这里是关于该主题的 django 文档的链接。

于 2008-09-25T17:18:16.197 回答