【问题标题】:Django reusable app url namespace issueDjango可重用应用程序url命名空间问题
【发布时间】:2013-11-09 19:40:18
【问题描述】:

我有一个 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 项目工作?

【问题讨论】:

  • 我们可以看看你的反向函数调用吗?
  • @GamesBrainiac 我已经添加了错误的完整回溯,包括函数调用。

标签: python django namespaces urlconf


【解决方案1】:

问题出现是因为你在做一些测试,而这并没有将tests's url 添加到主urls.py,这就是原因:

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

给予:

u'tests' is not a registered namespace

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

【讨论】:

  • 我知道问题出在哪里,但我不知道如何解决。如果我只测试我的可重用应用程序,哪个是主要的 urls.py 文件?
  • @AndreiHorak 只需将您的测试应用程序添加到您的主urls.py,并将其注册为应用程序,它应该可以正常工作。
  • 我正在测试一个唯一的可重复使用的应用程序,我不明白你在说哪个urls.py。我使用pip 安装了我的应用程序包并运行django-admin.py test tests --settings=tests.settings。除了tests/urls.py 中的那个,我没有其他urls.py
  • 那么,tests 是您唯一的应用程序吗?
  • 是的,tests 是唯一的应用程序。
【解决方案2】:

我在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')),
)

网址反向问题现已解决,一切正常。

【讨论】:

  • 这就是我告诉你的。我以为你除了tests之外还有其他应用。
  • 不,我没有,并且对将包含在命名空间中的内容放在哪里感到困惑。感谢您的帮助。
猜你喜欢
  • 2017-03-13
  • 2016-10-29
  • 2020-05-23
  • 1970-01-01
  • 2021-10-07
  • 2011-04-04
  • 2011-03-10
  • 2018-08-20
  • 1970-01-01
相关资源
最近更新 更多