Trong phiên bản Django 2.x, cách cấu hình đường dẫn URL đã thay đổi từ sử dụng hàm url() ở Django 1.x sang các hàm path() và re_path(). Module cần import cũng thay đổi từ
from django.conf.urls import url, include thành from django.urls import path, re_path, include.
Hàm url() cũ nhận bốn tham số: hai bắt buộc là regex và view, cùng với hai tùy chọn là kwargs và name. Trong khi đó, hàm path() mới cũng có bốn tham số tương tự nhưng không yêu cầu viết biểu thức chính quy (regex). Dưới đây là chi tiết về từng tham số của path():
# Tham số route
route là tiêu chí để khớp với URL (giống như một biểu thức chính quy). Khi Django phản hồi một yêu cầu HTTP, nó sẽ lần lượt kiểm tra danh sách urlpatterns từ trên xuống dưới cho đến khi tìm thấy mục khớp.
# Tham số view
Khi Django tìm thấy một tiêu chí khớp, nó sẽ gọi hàm view tương ứng và truyền đối tượng HttpRequest làm tham số đầu tiên, kèm theo các tham số được "bắt" dưới dạng tham số khóa từ.
# Tham số kwargs
Các tham số khóa từ bổ sung có thể được truyền đến hàm view dưới dạng một từ điển.
# Tham số name
Việc đặt tên cho URL giúp bạn tham chiếu duy nhất đến nó ở mọi nơi trong dự án Django, đặc biệt là trong các template. Điều này rất hữu ích khi bạn muốn thay đổi toàn cục một mẫu URL chỉ bằng việc sửa đổi một file.
Trong Django 2.x, hàm path() sử dụng cú pháp đơn giản hơn mà không cần đến biểu thức chính quy. Để bắt giá trị từ URL, bạn sử dụng dấu ngoặc nhọn (<>):
# Ví dụ về các kiểu chuyển đổi mặc định:
<str:param> - Bắt chuỗi bất kỳ ngoại trừ dấu gạch chéo '/'.
<int:param> - Bắt số nguyên dương hoặc không.
<slug:param> - Bắt chuỗi slug hợp lệ (bao gồm chữ cái ASCII, số và ký tự '-','_').
<uuid:param> - Bắt UUID định dạng chuẩn (phải có dấu gạch ngang và chữ thường).
<path:param> - Bắt bất kỳ chuỗi nào, bao gồm cả dấu gạch chéo '/'.
Ví dụ, giả sử bạn có một hàm view như sau:
def danh_sach_nguoi_dung(request, ma_sach):
# Xử lý logic
pass
Bạn có thể cấu hình URL như sau:
from django.urls import path
urlpatterns = [
path('danh-sach-nguoi-dung//', views.danh_sach_nguoi_dung, name='danh_sach_nguoi_dung'),
]
Đối với các trường hợp phức tạp hơn mà path() không đáp ứng được, bạn có thể sử dụng re_path() với biểu thức chính quy:
from django.urls import re_path
urlpatterns = [
re_path(r'^nguoi-dung/(\d+)/$', views.danh_sach_nguoi_dung, name='danh_sach_nguoi_dung'),
]
Lưu ý rằng trong file urls.py của ứng dụng con (app), bạn cần khai báo biến app_name để tránh lỗi:
app_name = 'ten_ung_dung'