2013-10-04 16 views
24

Tôi đang nghiên cứu tài liệu Django nhưng tôi phải tham gia một phần mà tôi không thể hiểu được loại vấn đề nào đang giải quyết và tài liệu không rõ ràng với tôi. Bất cứ ai biết, bạn có thể vui lòng cung cấp cho tôi một ví dụ thực sự về cách sử dụng không gian tên trong một vấn đề thực sự. Tôi biết cú pháp nhưng tôi không biết mục đích của điều này .. Tôi không thể hiểu được. Cảm ơnVí dụ thực sự về không gian tên URL

Trả lời

30

Thông thường, chúng được sử dụng để đặt URL của từng ứng dụng vào không gian tên của chính chúng. Điều này ngăn chức năng Django reverse() Django và chức năng mẫu {% url %} trả về sai URL vì tên mẫu URL đã xảy ra để khớp với một ứng dụng khác.

gì tôi có trong dự án cấp của tôi urls.py tập tin như sau:

from django.conf.urls.defaults import * 
from django.conf import settings 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    url(r'^$', 'main.views.main', name='main'), 
    url(r'^login$', 'django.contrib.auth.views.login', name="login"), 
    url(r'^logout$', 'django.contrib.auth.views.logout', 
     {"next_page": "/"}, name="logout"), 

# Admin 
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 
    url(r'^admin/', include(admin.site.urls)), 
) 

# Auto-add the applications. 
for app in settings.LOCAL_APPS: 
    urlpatterns += patterns('', 
     url(r'^{0}/'.format(app), include(app + '.urls', namespace=app)), 
    ) 

Lưu ý phần cuối cùng: đây đi qua các ứng dụng tôi đã cài đặt (settings.LOCAL_APPS là một khung cảnh tôi nói thêm rằng chỉ chứa ứng dụng của tôi nó được thêm vào INSTALLED_APPS có những thứ khác như Nam), tìm kiếm một số urls.py trong mỗi người và nhập các URL đó vào không gian tên được đặt tên theo ứng dụng và cũng đặt các URL đó vào thư mục con URL có tên sau ứng dụng.

Vì vậy, ví dụ, nếu tôi có một ứng dụng có tên hosts, và hosts/urls.py trông giống như:

from django.conf.urls.defaults import * 

urlpatterns = patterns('hosts.views', 
    url(r'^$', 'show_hosts', name='list'), 
) 

Bây giờ tôi views.py có thể gọi reverse("hosts:list") để có được URL đến trang mà các cuộc gọi hosts.views.show_hosts, và nó sẽ xem xét một cái gì đó như "/hosts/". Tương tự với {% url "hosts:list" %} trong một mẫu. Bằng cách này, tôi không phải lo lắng về việc va chạm với một URL có tên là "danh sách" trong một ứng dụng khác, và tôi không phải thêm tiền tố vào mỗi tên với hosts_.

Lưu ý rằng trang đăng nhập là {% url "login" %} vì nó không được cung cấp một không gian tên.

+2

tôi thấy .. nhưng điều này cũng giống như đặt một tên vào một URL, phải không? Làm cùng một công việc .. –

+1

Bây giờ tôi đã thấy câu trả lời đầy đủ ... và nó thật tuyệt vời ...Nếu tôi đã đúng, bạn sử dụng không gian tên cùng với URL được đặt tên .. để bạn sẽ không lo lắng về việc bạn đã đặt tên cho hai chế độ xem từ các ứng dụng khác nhau có cùng tên ... đúng không? –

+1

Khá nhiều. Tôi chắc rằng có những cách sử dụng khác, và tốt hơn, nhưng đây là một ví dụ nhanh. –

0

xem xét bạn đang sử dụng một mẫu url như sau
url(r'^login/',include('app_name', name='login'))

Cũng xem xét bạn đang sử dụng một ứng dụng của bên thứ ba như Django-RestFramework. Khi bạn sử dụng ứng dụng, bạn phải khai báo dòng sau trong URL conf tệp của dự án.

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) 

Bây giờ nếu bạn kiểm tra mã của phần còn lại-framework, bạn sẽ tìm thấy đoạn mã sau trong tập tin urls.py

urlpatterns = [ 
    url(r'^login/$', login, login_kwargs, name='login'), 
    url(r'^logout/$', logout, name='logout'), 
] 

Chúng tôi đã sử dụng 'đăng nhập' tên cho mẫu URL vào của chúng tôi dự án và cùng tên đang được sử dụng bởi Django-rest-framework cho một trong các mẫu URL của chúng. Khi bạn sử dụng ngược lại ('đăng nhập'), Django sẽ bị lẫn lộn.
Để giải quyết các loại vấn đề này, chúng tôi sử dụng không gian tên.

@register.simple_tag 
def optional_docs_login(request): 
    """ 
    Include a login snippet if REST framework's login view is in the URLconf. 
    """ 
    try: 
     login_url = reverse('rest_framework:login') 
    except NoReverseMatch: 
     return 'log in' 

Tên URL của không gian tên sẽ không bao giờ xung đột với các không gian tên khác.
Mẫu URL namespaced thể đảo ngược sử dụng
reverse('namespace:url_name')