23

look:like:thisDjango URLConf でネストされた URL 名前空間 ( which ) を定義する方法を理解しようとしています。

この前に、基本的な URL 名前空間を作成する方法を理解し、ファイルに入れる内容を含むこの簡単なサンプル スニペットを考え出しました。urls.py

from django.conf.urls import patterns, include, url

# you can only define a namespace for urls when calling include():

app_patterns = patterns('',
    url(r'^(?P<pk>[\w\-]+)/$', 'yourapp.views.your_view_function',
        name="your-view"),
)

urlpatterns = patterns('',
    url(r'^view-function/', include(app_patterns,
        namespace='yournamespace', app_name='yourapp')),
)

"""

    You can now use the namespace when you refer to the view, e.g. a call
    to `reverse()`:

    # yourapp/models.py

    from django.core.urlresolvers import reverse

    # ...

    class MyModel(models.Model):

        def get_absolute_url(self):
            return reverse('signalqueue:exception-log-entry', kwargs=dict(pk=self.pk))

"""

...この場合、 Djangoのドキュメントがまったく役に立たなかったという推論をw/r/t 。Django のドキュメントは他のすべての点で素晴​​らしく、これは規則の例外ですが、ネストされた URL 名前空間の定義に関する情報はさらに少ないです。

これを理解するためのスパゲティ化された試み†を投稿する代わりに、ネストされた名前空間を定義し、共有できるURLconfの率直で説得力のある、および/または自明な例を誰かが持っているか、知っているかどうかを尋ねるかもしれないと思いました。

具体的には、ビューの前にあるネストされた部分に興味があります: それらはすべてDjango アプリをインストールする必要がありますか?

†) 好奇心旺盛な方のために、(おそらくやや不可解な) 例を示します: http://imgur.com/NDn9Htestapp:views:<viewname>下部に赤と緑で印刷された URL を取得して、名前だけではなく名前を付けようとしていましたtestapp:<viewname>

4

2 に答える 2

35

かなり直感的に機能します。includeさらに別の名前空間を持つ urlconf はinclude、ネストされた名前空間になります。

## urls.py
nested2 = patterns('',
   url(r'^index/$', 'index', name='index'),
)

nested1 = patterns('',
   url(r'^nested2/', include(nested2, namespace="nested2"),
   url(r'^index/$', 'index', name='index'),
)   

urlpatterns = patterns('',
   (r'^nested1/', include(nested1, namespace="nested1"),
)

reverse('nested1:nested2:index') # should output /nested1/nested2/index/
reverse('nested1:index') # should output /nested1/index/

これは、URL を整理しておくのに最適な方法です。私ができる最善のアドバイスは、(私の例のように) オブジェクトを直接include受け取ることができることを覚えておくことだと思います。これにより、複数の url ファイルを作成することなく、単一のビューと分割されたビューを便利な名前空間に使用できます。patternsurls.py

于 2012-10-02T02:51:40.277 に答える