Menu
CoddyTech

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 %}.

challenge icon

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.

  1. Trong jobs/views.py, thêm JobDetailView, một DetailView của Job.
  2. Trong jobs/urls.py, thêm tuyến đường "jobs/<int:pk>/" có tên detail.
  3. 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"]
quiz iconTự kiểm tra

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