如何将django.core.urlresolvers.reverse与函数引用而不是命名URL模式一起使用?

时间:2020-03-06 14:44:05  来源:igfitidea点击:

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

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

其中categoriesmyapp / views.py中的视图函数。没有其他URLconf行引用views.categories

在一个单元测试文件中,我试图使用django.core.urlresolvers.reverse()来获取此URL,而不是仅仅复制'/ 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文档中了解到的,我不应该只是为了使用reverse就将其命名为URL模式。

我有什么想法我做错了吗?

解决方案

反向功能实际上使用URL的"名称"。定义如下:

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

现在,我们将使用字符串" no-monkeys"调用反向以获取正确的URL。

忍者编辑:这是有关该主题的django文档的链接。

这确实可行,并且我们粘贴的所有代码都是正确的并且可以正常工作(我只是将其复制到一个干净的测试/项目应用程序中,并且它毫无疑问地反转了URL)。因此,这里还有其他事情尚未向我们展示。简化到最基本的基础,直到可以使用,然后再开始增加复杂性,看看它在哪里破裂。

另外,我们可以执行" ./manage.py shell",然后以交互方式导入反向函数和视图函数,然后尝试反向。这将删除测试设置,这可能是一个可能的原因。

Hyman·M(Hyman M.)的例子几乎是正确的。

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

url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),

经过进一步调查,结果证明我导入视图模块的方式存在问题:

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

伙计们,谢谢帮助:我们启发了我正确地研究它。