Menu
CoddyTech

DetailView

本课属于 Coddy Django 学习旅程的“基于类的视图”单元。第 5 课,共 18 课。

每个职位都需要自己的页面:找到职位并显示出来;如果没有这个职位,就返回 404“页面未找到”。这就是 DetailView。在食谱网站中:

class RecipeDetailView(DetailView):
    model = Recipe


# urls.py
path("recipes/<int:pk>/", views.RecipeDetailView.as_view(), name="recipe")

DetailView 会从名为 pk 的 URL 参数中读取行的主键,并像 get_object_or_404() 那样查找该行。它默认使用的模板是 recipes/recipe_detail.html,该行会以 object 和 recipe 的形式传入。

pk 这个名称很重要。如果路由写成 <int:id>,视图就会收到一个它不会查找的参数,页面会崩溃,并报出 AttributeError,提示需要一个对象的 pk 或 slug。

链接会将该行的 pk 传给路由名称:{% url 'recipes:recipe' recipe.pk %}。

challenge icon

挑战

简单

为每个职位创建独立页面,并使用现成的模板 jobs/job_detail.html。

  1. 在 jobs/views.py 中添加 JobDetailView,它是一个以 Job 为对象的 DetailView。
  2. 在 jobs/urls.py 中添加名为 detail 的路由 "jobs/<int:pk>/"。
  3. 在 job_list.html 中,将每个职位的标题设为指向其页面的链接。

点击 Python Developer 打开它的页面,然后打开 /jobs/999/:你会看到“404 页面未找到”。

亲手试试

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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基于类的视图中的所有课

自己练习: Django 在线编辑器