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
相关产品推荐
相关产品推荐

