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_URLCONFconfig 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つまり)、エラーは非常に論理的です。

私の質問は、アプリがインストールされている Django プロジェクトとは無関係に URL が機能するように、再利用可能なアプリのこの名前空間をどこでどのように定義すればよいですか?

4

2 に答える 2

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 逆引きの問題が解決され、すべてが期待どおりに機能するようになりました。

于 2013-10-30T09:57:02.747 に答える
2

いくつかのテストを行っているために問題が発生し、これがtests'smain に url を追加していないためです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 に答える