You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 01:42:36