2012-10-02 15 views
11

Tôi đã cố gắng tìm ra cách xác định một không gian tên lồng nhau URL (trong đó look:like:this) trong một Django URLConf.Xác định không gian tên lồng nhau trong URLConf, để đảo ngược URL Django - có ai có ví dụ hợp lý không?

Trước đó, tôi đã tìm ra cách để làm một namespace URL cơ bản và đã đưa ra this simple example snippet, chứa những gì bạn có thể đặt trong một tập tin 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)) 

""" 

... w/r/t khấu trừ trong đó, the Django documentation, trong trường hợp này, không hề hữu ích. Trong khi tài liệu của Django là tuyệt vời trong tất cả các khía cạnh khác, và đây là một ngoại lệ cho quy tắc, thậm chí còn có ít thông tin hơn về việc xác định các không gian tên URL lồng nhau.

Thay vì đăng các nỗ lực cố định của mình, tôi nghĩ rằng tôi có thể hỏi liệu có ai có, hoặc biết, một ví dụ đơn giản và/hoặc tự giải thích về một URLconf xác định không gian tên lồng nhau có thể chia sẻ.

Cụ thể tôi tò mò về các phần lồng nhau tiền tố xem: cần chúng tất cả được cài đặt ứng dụng Django?

†) Đối với tò mò, đây là ví dụ (có thể hơi khó hiểu): http://imgur.com/NDn9H. Tôi đã cố gắng để có được các URL in ra màu đỏ và màu xanh lá cây ở phía dưới để được đặt tên testapp:views:<viewname> thay vì chỉ testapp:<viewname>.

Trả lời

21

Nó hoạt động khá trực quan. include một urlconf đã có một tên khác include sẽ dẫn đến các vùng tên lồng nhau.

## 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/ 

Đây là cách tuyệt vời để giữ các url được tổ chức. Tôi cho rằng lời khuyên tốt nhất tôi có thể nhớ là include có thể lấy trực tiếp đối tượng patterns (như trong ví dụ của tôi) cho phép bạn sử dụng một số urls.py và chia tách các không gian tên hữu ích mà không phải tạo nhiều tệp url.

+0

Nice, đó là thực sự đơn giản. Cảm ơn! – fish2000

4

Trong khi câu trả lời của Yuji là chính xác, lưu ý rằng django.conf.urls.patterns không còn tồn tại (kể từ Django 1.10) và danh sách đơn giản được sử dụng thay thế.

Ví dụ cùng urls.py bây giờ sẽ như thế này:

from django.conf.urls import include, url 

nested2 = [ 
    url(r'^index/$', 'index', name='index'), 
] 

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

urlpatterns = [ 
    url(r'^nested1/', include(nested1, namespace="nested1"), 
] 

Và vẫn còn được sử dụng như:

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

Không phải biến 'urlpatterns' cũng có cuộc gọi hàm' url'? –

+0

@NathanJones Rất tiếc, cảm ơn - đã sửa. –

Các vấn đề liên quan