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

Django问题:DetailView类视图无法同时展示两个模型数据

Django DetailView 展示关联模型数据问题解决

问题根源

你遇到的问题有两个核心原因:

  • 模板中引用的well变量未在上下文定义,你实际传入的是复数形式的wells
  • 当前视图获取的是所有Well数据,而非当前Project关联的Well

解决方案

1. 修正视图逻辑

修改get_context_data方法,只查询当前Project对应的Well数据:

class ProjectDetailView(DetailView):
    model = Project
    template_name = 'project/project_detail.html'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # self.object 是DetailView自动获取的当前Project实例
        context['wells'] = Well.objects.filter(project_name=self.object)
        return context

2. 调整模板代码

由于一个Project对应多个Well,需要通过循环遍历wells来展示每个油井信息:

<!-- 显示当前Project信息 -->
<h1>{{ project.project_name }}</h1>
<p>项目地点:{{ project.project_location }}</p>

<!-- 显示关联的Well列表 -->
<h2>关联油井</h2>
{% for well in wells %}
    <p>{{ well.well_name }}</p>
{% empty %}
    <p>暂无关联油井</p>
{% endfor %}

额外优化:规范模型字段命名

你的Well模型中ForeignKey字段命名为project_name不符合Django惯例,建议修改为project,提升代码可读性:

class Well(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    well_name = models.CharField(max_length=100)
    
    def __str__(self):
        return self.well_name

修改后,视图中的查询代码可以简化为:

context['wells'] = self.object.well_set.all()

如果想更直观,还可以设置related_name:

project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='wells')

此时视图中直接使用self.object.wells.all()即可获取关联油井。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:26:11