Làm cách nào tôi có thể chuyển các tham số giá trị từ chế độ xem HTML sang Django?

Như được mô tả trong hướng dẫn Django về chế độ xem và tài liệu xử lý yêu cầu, nếu bạn muốn nắm bắt một phần của URL để sử dụng trong chức năng chế độ xem, bạn có thể thực hiện bằng cách định cấu hình URL của mình

Giả sử chúng ta có một trang web thương mại điện tử nơi chúng ta muốn hiển thị các sản phẩm trên các trang riêng lẻ. Chúng tôi muốn /product/ là tiền tố cho tất cả các trang này và phần tiếp theo là “slug” cho sản phẩm — một phiên bản thân thiện với URL của tên (e. g white-t-shirt thay vì “Áo thun trắng”)

Chúng ta có thể làm điều đó như sau

# urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('products//', views.product_detail, name='product_detail'),
]

# views.py

def product_detail(request, slug):
    return TemplateResponse(request, 'shop/product_detail.html', {})

Lưu ý cách thêm tham số slug để xem chữ ký hàm, cũng như trong URL conf. Trong mẫu URL, slug đầu tiên là loại trình chuyển đổi đường dẫn. slug thứ hai là tên của tham số trong chế độ xem

# views.py

def product_detail(request, slug):
    return TemplateResponse(request, 'shop/product_detail.html', {})
1 và chúng tôi có thể đã chọn một cái gì đó khác

Nếu bạn không sửa đổi chế độ xem như thế này, nó sẽ không hoạt động — bạn sẽ nhận được một ngoại lệ, bởi vì Django sẽ cố gắng gọi hàm của bạn với các tham số mà hàm của bạn không chấp nhận, đây là một lỗi trong Python

Nếu bạn đã quen với CBV, đây là một trong những điểm khác biệt rõ ràng hơn. Với CBV, bạn không phải sửa đổi chữ ký chức năng — vì không có chữ ký nào để sửa đổi. Nhưng với CBV, bạn phải viết thêm mã để giữ tham số đó

Đảm bảo kiểm tra tài liệu Django về trình chuyển đổi đường dẫn để biết các loại nội dung khác nhau mà bạn có thể thêm vào URL của mình. Nếu bạn thích các gợi ý về loại, hãy xem bên dưới để biết các mẹo về cách bạn có thể nâng cao mẫu này

Mặt khác, vào Hiển thị một đối tượng cơ sở dữ liệu duy nhất , nơi chúng tôi sẽ thực sự sử dụng tham số slug.

Thảo luận. Mã chung và chữ ký chức năng¶

Cơ chế gửi URL tới chức năng của Django rất thanh lịch và mạnh mẽ, chuyển đổi các phần của URL thành một tham số chức năng sẵn sàng và đang chờ được sử dụng

Với chức năng chuyển đổi đường dẫn được thêm vào trong 2. 0, nó đã tốt hơn rất nhiều, bởi vì nó sẽ tự động chuyển đổi mọi thứ thành loại chính xác cho bạn, giảm số lượng chuyển đổi loại mà bạn phải thực hiện trong chức năng của mình

Ngoài ra, bạn có thể sử dụng điều này bằng cách thêm gợi ý loại

def product_detail(request, name: str):
    pass  # etc

# OR
def product_detail(request, pk: int):
    pass  # etc

Bây giờ, bạn không còn phải kiểm tra URLconf để chắc chắn về loại đối số, nó ở ngay trong hàm của bạn

Sự sang trọng của các tham số URL như một phần của chữ ký chức năng trái ngược với CBV, nơi bạn phải thực hiện thêm công việc để giữ tham số

name = self.kwargs['name']

Thảo luận. Tham số được kiểm tra loại¶

Tất nhiên, nếu chúng tôi thêm gợi ý loại, sẽ không tuyệt hơn nữa nếu chúng tôi có thể tự động đảm bảo rằng cấu hình URL phù hợp với chức năng xem, cả về tên và loại đối số?

django-urlconfchecks sẽ thực hiện chính xác điều đó. (Dựa trên mã tôi đã viết, nhưng được đóng gói độc đáo bởi Ali Sayyah)

Thật không may, bạn sẽ thua ở đây nếu bạn đang sử dụng CBV, vì bạn không có chữ ký để có thể trang trí bằng các gợi ý về loại. Chữ ký hiển thị bên ngoài cho chế độ xem của bạn là

# views.py

def product_detail(request, slug):
    return TemplateResponse(request, 'shop/product_detail.html', {})
1, vì vậy mã kiểm tra loại ở trên không thể hoạt động

Vấn đề cơ bản ở đây là mã chung. Mã chung hữu ích chính xác vì độ rộng của nó — nó có thể được sử dụng trong nhiều tình huống. Tuy nhiên, nhược điểm của mã chung là nó phải phục vụ cho mọi tình huống, thay vì chỉ của bạn. Vì vậy, CBV phải có một cuốn từ điển

# views.py

def product_detail(request, slug):
    return TemplateResponse(request, 'shop/product_detail.html', {})
2, đó không thực sự là điều bạn muốn. Mã chung theo định nghĩa thiếu liên lạc cá nhân

Tất nhiên, có thể có những lúc ưu điểm vượt trội hơn nhược điểm. Nhưng hãy chắc chắn rằng bạn biết những gì bạn đang thiếu