Django基于类的DetailView中如何获取URL传递的pk参数
Django DetailView获取URL参数及对应模型字段方法
核心原理
你配置的URL路由中<int:pk>是Django通用视图约定的主键参数名,继承DetailView后,视图会自动捕获该pk值、查询对应Pet模型实例,不需要手动写ORM查询取数。
具体实现
不要在类属性定义位置(即你之前注释key = ...的位置)写查询逻辑,类加载阶段无请求上下文,根本拿不到当前访问对应的pk值。你需要在视图的请求处理方法中获取实例和字段值,参考以下修改后的views.py代码:
from django.shortcuts import render from django.views.generic import TemplateView, ListView, UpdateView, CreateView, DeleteView, DetailView from django.urls import reverse_lazy from .models import Pet from datetime import date class PetProfileView(DetailView): model = Pet template_name = 'pet_profile.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # self.object 就是当前pk对应的Pet实例,直接取字段值即可 birth_date = self.object.birth_date # 自定义日期计算逻辑示例:计算宠物周岁年龄 today = date.today() pet_age = today.year - birth_date.year - ( (today.month, today.day) < (birth_date.month, birth_date.day) ) # 将计算结果传入模板上下文 context['birth_date'] = birth_date context['pet_age'] = pet_age return context
其他说明
- 如果需要单独获取URL传入的原始pk值,在视图的请求方法中直接取
self.kwargs['pk']即可,所有URL命名参数都存储在self.kwargs字典中 - 模板中可以直接调用传入的变量,示例:
<div class="pet-profile"> <h2>{{ object.pet_name }}</h2> <p>品种:{{ object.pet_breed }}</p> <p>出生日期:{{ birth_date|date:"Y-m-d" }}</p> <p>年龄:{{ pet_age }}岁</p> </div>
如果你后续修改URL参数名,比如把
<int:pk>改成<int:pet_id>,需要在视图类中添加配置pk_url_kwarg = 'pet_id',告诉DetailView哪个参数是模型主键,当前配置不需要额外设置。
内容的提问来源于stack exchange,提问作者Jordan Hristov
相关产品推荐
相关产品推荐

