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

Django使用DetailView无法获取关联模型数据如何解决

问题排查结论

核心错误为SchoolDetailView绑定的模型错误,直接导致渲染数据不符合预期:

  • 该视图用于展示学校详情,但代码中错误配置model = Student,框架会根据URL传入的主键值查询Student表的单条记录,而非School表记录
  • 查询返回的Student实例仅包含name/age/school外键字段,不存在principal、location属性,模板渲染时这两个字段直接显示为空
  • students是School模型上通过外键related_name定义的反向关联属性,Student实例无该属性,因此school_detail.students.all无法取到任何数据,学生列表渲染为空
  • 你看到的Name: Max是查询到的那条Student记录的姓名字段,和学校信息完全无关
修复方案

1. 修正views.py中SchoolDetailView的模型配置

将错误的模型引用替换为School,修正后代码:

from django.views.generic import ListView, DetailView
from .models import School


class SchoolListView(ListView):
    model = School
    context_object_name = 'schools'


class SchoolDetailView(DetailView):
    context_object_name = 'school_detail'
    model = School
    template_name = 'my_app/school_detail.html'

2. (规范优化)调整urls.py的详情页路由

原路由未指定主键类型、缺少结尾斜杠,容易出现匹配异常,建议调整为:

from django.urls import path
from app_for_classes import views

app_name = 'my_app'

urlpatterns = [
    path("", views.CBView.as_view(), name="base"),
    path("index/", views.IndexView.as_view(), name="index"),
    path("list/", views.SchoolListView.as_view(), name="list"),
    path("list/<int:pk>/", views.SchoolDetailView.as_view(), name="detail"),
]
修复后效果

重启服务访问对应学校详情页时,框架会根据URL主键查询正确的School实例:

  • 可正常渲染学校名称、校长、地址字段
  • 可通过反向关联students.all拿到该学校下所有关联学生,正常循环渲染学生列表,完全匹配模板预期逻辑

内容的提问来源于stack exchange,提问作者HezretSaryyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:06:20