4

我有一个 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配置变量更改为指向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 项目工作?

4

2 回答 2

3

我在Django 手册中找到了解决此问题的快速方法。

在我的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 反向问题,一切都按预期工作。

于 2013-10-30T09:57:02.747 回答
2

出现问题是因为您正在进行一些测试,而这并没有将tests'surl 添加到 main urls.py,这就是为什么:

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

给出:

u'tests' is not a registered namespace

因为您还没有tests在主urls.py文件中添加包。

于 2013-10-30T09:55:46.643 回答