在我的urls.py
文件中,我有:
from myapp import views
...
(r'^categories/$', views.categories)
其中categories
是myapp/views.py
内的视图函数。没有其他URLconf行引用views.categories
。
在单元测试文件中,我尝试使用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')
但据我所知the reverse
documentation,我不应该只是使用reverse
来命名网址模式。
任何想法我做错了什么?
答案 0 :(得分:2)
Jack M.的例子几乎是正确的。
如果你想使用命名网址,它必须是一个网址功能,而不是一个元组。
url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
答案 1 :(得分:2)
经过进一步调查后发现,这是我导入视图模块的一个问题:
How do I successfully pass a function reference to Django’s reverse() function?
感谢你的帮助,伙计们:你激励我正确看待它。
答案 2 :(得分:0)
这确实有效,并且您粘贴的所有代码都是正确的并且工作正常(我只是将其复制到一个干净的测试/项目应用程序中,并且它没有任何问题地反转了URL)。所以这里还有其他事情你没有向我们展示过。简化到简单的基础,直到它工作,然后开始增加复杂性,看看它在哪里破碎。
此外,您可以执行“./manage.py shell”,然后以交互方式导入反向函数和视图函数,并尝试相反。这将删除测试设置作为可能的原因。
答案 3 :(得分:-1)
反向函数实际上使用URL的“名称”。这个定义如下:
urlpatterns = patterns('',
(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
(r'^admin/(.*)', admin.site.root),
)
现在,您将使用字符串“no-monkeys”调用reverse来获取正确的URL。
Ninja编辑:Here is a link关于该主题的django文档。