Có tốt hơn không khi sử dụng đường dẫn () hoặc url () trong urls.py cho django 2.0?


131

Trong một khóa học trực tuyến django, người hướng dẫn đã cho chúng tôi sử dụng url()chức năng để gọi các khung nhìn và sử dụng các biểu thức thông thường trong danh sách urlpotypes. Tôi đã thấy các ví dụ khác trên youtube về điều này. ví dụ

from django.contrib import admin
from django.urls import include
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^polls/', include('polls.urls')),
]


#and in polls/urls.py

urlpatterns = [        
    url(r'^$', views.index, name="index"),
]

Tuy nhiên, trong quá trình thực hiện hướng dẫn Django, họ sử dụng path()thay vì:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name="index"),        
]

Hơn nữa, các biểu thức chính quy dường như không hoạt động với path()chức năng như sử dụng chế độ xem path(r'^$', views.index, name="index")không tìm thấy mysite.com/polls/.

Là sử dụng path()mà không có regex phù hợp với cách thích hợp trong tương lai? Là url()mạnh hơn nhưng phức tạp hơn vì vậy họ đang sử dụng path()để bắt đầu chúng tôi ra với? Hay đó là một trường hợp của các công cụ khác nhau cho các công việc khác nhau?


2
Nếu bạn đang theo một hướng dẫn, tôi sẽ sử dụng bất kỳ phong cách nào mà hướng dẫn sử dụng, để ngăn ngừa lỗi khi chuyển đổi giữa path()url(). Nếu bạn muốn hoặc cần sử dụng regexes, thì bạn phải sử dụng re_path()hoặc url(). Ngoài ra, tôi nghĩ nó thực sự tùy thuộc vào bạn chọn cái nào.
Alasdair

Câu trả lời:


174

Từ tài liệu Django cho url

url(regex, view, kwargs=None, name=None)Chức năng này là một bí danh django.urls.re_path(). Nó có khả năng bị phản đối trong phiên bản tương lai.

Sự khác biệt chính giữa pathre_pathpathsử dụng tuyến không có regex

Bạn có thể sử dụng re_pathcho các cuộc gọi regex phức tạp và chỉ sử dụng pathcho các tra cứu đơn giản hơn


1
Cảm ơn về thông tin chi tiết! re_pathlà những gì tôi đang tìm kiếm sau đó.
FrostedCookies

65

Hàm mới django.urls.path()cho phép cú pháp định tuyến URL đơn giản hơn, dễ đọc hơn. Ví dụ, ví dụ này từ các bản phát hành Django trước đây:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)

có thể được viết là:

path('articles/<int:year>/', views.year_archive)

Các django.conf.urls.url() chức năng từ các phiên bản trước hiện có sẵn như django.urls.re_path(). Vị trí cũ vẫn còn để tương thích ngược, không có sự phản đối sắp xảy ra. django.conf.urls.include()Chức năng cũ hiện có thể nhập được django.urlsđể bạn có thể sử dụng:

from django.urls import include, path, re_path

trong URLconfs . Để đọc thêm tài liệu django


10
Một chút sai lệch vì path()ví dụ của bạn cho phép các số không có bốn chữ số.
BrainCore

Dấu /<int:year>/hiệu cho thấy năm nên ở dạng nguyên, tôi đề nghị bạn xem qua tài liệu chính thức.
Sylvernus Akubo

2
@silvablaze Như BrainCore đã nêu, intkhông tương đương với [0-9]{4}. Cho dù nó được sử dụng cho số nguyên hay không không có liên quan đến mối quan hệ này. Có lẽ nếu bạn thay thế [0-9]{4}bằng [0-9]+so sánh của bạn có thể ít chính xác hơn, mặc dù bạn vẫn có thể cần phải xử lý loại kết quả cuối cùng (str vs int?).
Jan Kyu Peblik

Đó là câu trả lời rõ ràng về chủ đề này. Cảm ơn.
VikasBhat

19

pathchỉ đơn giản là mới trong Django 2.0, mới chỉ được phát hành vài tuần trước. Hầu hết các hướng dẫn sẽ không được cập nhật cho cú pháp mới.

Nó chắc chắn được coi là một cách đơn giản hơn để làm việc; Tôi sẽ không nói rằng URL mạnh hơn mặc dù, bạn sẽ có thể thể hiện các mẫu theo một trong hai định dạng.


9

Các biểu thức chính quy dường như không hoạt động với path()hàm với các đối số sau : path(r'^$', views.index, name="index").

Nó nên như thế này : path('', views.index, name="index").

Đối số 1 phải trống để nhập biểu thức chính quy.


2
Có, tôi nghĩ như đã chỉ ra ở trên để sử dụng REs, bạn phải sử dụng hàm re_path ().
FrostedCookies


2

Từ v2.0, nhiều người dùng đang sử dụng đường dẫn, nhưng chúng ta có thể sử dụng đường dẫn hoặc url. Ví dụ, trong django 2.1.1 ánh xạ tới các chức năng thông qua url có thể được thực hiện như sau

from django.contrib import admin
from django.urls import path

from django.contrib.auth import login
from posts.views import post_home
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^posts/$', post_home, name='post_home'),

]

trong đó bài đăng là một ứng dụng & post_home là một chức năng trong lượt xem

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.