2015-07-17 14 views
23

tôi nhận thấy rằng trong Django có hai định dạng của urlpatterns trong tập tin urls.py:Django: định dạng của urlpatterns trong urls.py

urlpatterns = [ 
    url(...), 
    url(...), 
] 

urlpatterns = pattern('', 
    url(...), 
    url(...), 
) 

Đầu tiên là một danh sách các trường hợp url và thứ hai gọi mô-đun pattern với một chuỗi rỗng và một số trường hợp là các tham số url.

  1. Sự khác biệt giữa hai loại là gì?
  2. Mục đích của chuỗi trống ở định dạng thứ hai là gì?
  3. Bạn nên sử dụng loại nào?

Trả lời

30

Trong Django 1.8+, urlpatterns chỉ đơn giản là danh sách url() s. Cú pháp mới này cũng thực sự hoạt động ở mức 1.7.

urlpatterns = [ 
    url(...), 
    url(...), 
] 

Cú pháp cũ sử dụng patternis deprecated trong Django 1.8, và được lấy ra trong Django 1.10.

urlpatterns = pattern('', 
    url(...), 
    url(...), 
) 

Với cú pháp cũ, bạn có thể cung cấp tiền tố. Ví dụ được cung cấp in the docs

urlpatterns = patterns('news.views', 
    url(r'^articles/([0-9]{4})/$', 'year_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'month_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'article_detail'), 
) 

Tuy nhiên, việc sử dụng đối số chuỗi cho chế độ xem hiện không còn được dùng nữa và bạn nên cung cấp cuộc gọi thay thế.

7

mỗi the documentation, patterns là:

Một chức năng mà phải mất một tiền tố, và một số tùy ý của URL mô hình, và trả về một danh sách các mẫu URL trong định dạng Django nhu cầu.

Đối số đầu tiên cho patterns() là một chuỗi prefix.

Nó cũng cung cấp một ví dụ về lý do tại sao bạn có thể muốn sử dụng nó:

from django.conf.urls import patterns, url 

urlpatterns = patterns('', 
    url(r'^articles/([0-9]{4})/$', 'news.views.year_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'news.views.month_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'news.views.article_detail'), 
) 

Trong ví dụ này, xem từng có một tiền tố chung - 'news.views'. Thay vì nhập số đó cho mỗi mục nhập trong urlpatterns, bạn có thể sử dụng đối số đầu tiên cho hàm patterns() để chỉ định tiền tố áp dụng cho từng chức năng xem.

Với điều này trong tâm trí, ví dụ trên có thể được viết ngắn gọn hơn như:

from django.conf.urls import patterns, url 

urlpatterns = patterns('news.views', 
    url(r'^articles/([0-9]{4})/$', 'year_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'month_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'article_detail'), 
) 

Tuy nhiên, lưu ý rằng chức năng này không được chấp:

Không dùng nữa kể từ phiên bản 1.8:

urlpatterns phải là một danh sách đơn giản của các trường hợp django.conf.urls.url() thay thế.

Lưu ý rằng the explanation as to why bao gồm (với lý do chính đáng, rõ ràng!):

Như vậy patterns() phục vụ ít mục đích và là một gánh nặng khi dạy người dùng mới (trả lời câu hỏi của người mới "tại sao tôi cần chuỗi trống này làm đối số đầu tiên cho patterns()? ").

+4

Cần lưu ý rằng tham chiếu chuỗi để xem các hàm và hàm 'patterns()' không còn được dùng nữa và sẽ bị xóa trong Django 1.10. Để tránh cảnh báo không dùng nữa, hãy sử dụng danh sách đơn giản thay thế. – knbk

+0

@knbk điểm tốt, đã thêm – jonrsharpe

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