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 %}。
挑战
简单为每个职位创建独立页面,并使用现成的模板 jobs/job_detail.html。
- 在
jobs/views.py中添加JobDetailView,它是一个以Job为对象的DetailView。 - 在
jobs/urls.py中添加名为detail的路由"jobs/<int:pk>/"。 - 在
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"]
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基于类的视图中的所有课
自己练习: Django 在线编辑器