代码之家  ›  专栏  ›  技术社区  ›  Paul D. Waite

如何使用django.core.urlresolvers.reverse和函数引用而不是命名的URL模式?

  •  8
  • Paul D. Waite  · 技术社区  · 16 年前

    在我的 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 ,我不应该只使用一个命名的URL模式 颠倒 .

    你知道我做错了什么吗?

    4 回复  |  直到 16 年前
        1
  •  2
  •   camflan    16 年前

    杰克·M的例子几乎是正确的。

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

    url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
    
        2
  •  2
  •   Community CDub    7 年前

    经过进一步的调查,发现我是如何导入视图模块的问题:

    How do I successfully pass a function reference to Django’s reverse() function?

    不过,谢谢你的帮助,伙计们:你激励我好好看看它。

        3
  •  0
  •   Carl Meyer    16 年前

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

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

        4
  •  -1
  •   Jack M.    16 年前

    反向函数实际上使用了URL的“名称”。定义如下:

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

    现在,您可以使用字符串“no monkes”调用reverse以获得正确的URL。

    Ninja Edit: Here is a link 向Django的相关文档。