如何将django.core.urlresolvers.reverse与函数引用而不是命名URL模式一起使用?
时间:2020-03-06 14:44:05 来源:igfitidea点击:
在我的urls.py文件中,我有:
from myapp import views ... (r'^categories/$', views.categories)
其中categories
是myapp / 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()函数?
伙计们,谢谢帮助:我们启发了我正确地研究它。