DetailView
Thuộc phần View dựa trên lớp trong hành trình Django của Coddy. Bài học 5 trên 18.
Mỗi công việc cần một trang riêng: tìm công việc, hiển thị công việc đó và trả về lỗi 404 Page not found nếu không có công việc như vậy. Đó là DetailView. Trên trang web công thức nấu ăn:
class RecipeDetailView(DetailView):
model = Recipe
# urls.py
path("recipes/<int:pk>/", views.RecipeDetailView.as_view(), name="recipe")DetailView đọc khóa chính của hàng từ đối số URL có tên pk rồi tìm hàng đó theo cách get_object_or_404() thực hiện. Mặc định, mẫu của nó là recipes/recipe_detail.html, và hàng được cung cấp dưới tên object và recipe.
Tên pk rất quan trọng. Nếu viết tuyến đường là <int:id>, chế độ xem sẽ nhận một đối số mà nó không tìm kiếm, khiến trang gặp sự cố với AttributeError yêu cầu pk hoặc slug của một đối tượng.
Liên kết truyền pk của hàng vào tuyến đường có tên: {% url 'recipes:recipe' recipe.pk %}.
Thử thách
DễTạo một trang riêng cho mỗi công việc bằng mẫu có sẵn jobs/job_detail.html.
- Trong
jobs/views.py, thêmJobDetailView, mộtDetailViewcủaJob. - Trong
jobs/urls.py, thêm tuyến đường"jobs/<int:pk>/"có têndetail. - Trong
job_list.html, tạo liên kết từ tiêu đề mỗi công việc đến trang của công việc đó.
Nhấp vào Python Developer để mở trang của công việc đó, sau đó mở /jobs/999/: bạn sẽ thấy 404 Page not found.
Tự làm thử
from django.views.generic import ListView, TemplateView
from .models import Job
class HomeView(TemplateView):
template_name = "jobs/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["count"] = Job.objects.count()
context["latest"] = Job.objects.order_by("-posted").first()
return context
class AboutView(TemplateView):
template_name = "jobs/about.html"
class JobListView(ListView):
model = Job
context_object_name = "jobs"
ordering = ["-posted"]
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong View dựa trên lớp
Tự luyện tập: Playground Django