Django可重用的app url命名空间问题

时间:2013-10-30 09:43:11

标签: python django namespaces urlconf

我有一个Django项目,training和此项目中的应用程序tests。文件夹结构如下所示:

django-training
    tests
        urls.py
    training
        urls.py

training/urls.py内我定义了这种模式:

url(r'^tests/', include('tests.urls', namespace='tests'))

tests/urls.py内,我定义了这些模式:

url(r'^$', index, name='index'),
url(r'^(\d+)/$', view, name='view'),
url(r'^give-up/$', give_up, name='give_up'),
url(r'^(\d+)/result/$', result, name='result')

一切正常。

但是,如果我想将tests应用程序打包为可在任何Django项目中运行的可重用应用程序,该怎么办?我该怎么处理URL模式?

我创建了一个tests/settings.py文件,并将ROOT_URLCONF config var更改为指向tests/urls.py。但这不起作用,因为会出现这个错误:

Traceback (most recent call last):
File "/home/user/.virtualenvs/clean2/local/lib/python2.7/site-packages/tests/tests.py", line 173, in testContext
    response = self.client.get(reverse('tests:view', args=(1,)))
File "/home/user/.virtualenvs/clean2/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 492, in reverse
key)
NoReverseMatch: u'tests' is not a registered namespace

错误非常符合逻辑,因为reverse需要定义名称空间(tests,即)。

我的问题是:我如何以及在何处为可重用的应用程序定义此命名空间,以便URL可以独立于安装该应用程序的Django项目工作?

2 个答案:

答案 0 :(得分:3)

我在Django manual找到了这个问题的快速解决方案。

在我的tests/urls.py我已将test命名空间包括在内:

test_patterns = patterns('',
    url(r'^$', index, name='index'),
    url(r'^(\d+)/$', view, name='view'),
    url(r'^give-up/$', give_up, name='give_up'),
    url(r'^(\d+)/result/$', result, name='result'),
)

urlpatterns = patterns('',
    url(r'^tests/', include(test_patterns, namespace='tests')),
)

现在解决了URL反向问题,一切都按预期工作。

答案 1 :(得分:2)

问题出现是因为您正在进行一些测试,而这还没有将tests's网址添加到主urls.py,这就是原因:

response = self.client.get(reverse('tests:view', args=(1,)))

给出:

u'tests' is not a registered namespace

因为您尚未在主tests文件中添加urls.py包。