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

如何在HTML模板中调用Django Admin的StackedInline关联模型数据?

Django DetailView模板无法显示关联子主题的解决方案

问题背景

在Django Admin中通过StackedInline为CancerType(癌症类型)模型关联SubTopic(子主题)模型,后台创建/编辑操作正常,但在SingleType(DetailView视图)对应的type.html模板中,无法显示当前癌症类型关联的子主题数据。

错误原因分析

  1. 模板上下文变量错误:SingleType是DetailView,传递给模板的是单个CancerType实例(默认变量名object或cancertype),但模板里误用了ListView专属的object_list变量,导致无法获取当前实例的关联数据。
  2. 反向关联调用错误:未正确使用Django的反向关联查询来获取当前癌症类型的子主题。
  3. 模板语法错误:循环、条件语句多写了闭合的},导致模板解析异常。
  4. 字段名匹配错误:SubTopic模型的富文本字段是topic,模板里错误调用了不存在的body字段。

修复步骤

1. 优化模型的反向关联(可选但推荐)

修改models.py中SubTopic的ForeignKey字段,添加related_name参数,让反向关联调用更直观:

# models.py
class SubTopic(models.Model):
    # 添加related_name,后续可通过cancertype.subtopics直接调用子主题
    type = models.ForeignKey(CancerType, on_delete=models.CASCADE, related_name='subtopics')
    title = models.CharField(max_length=200, blank=False)
    topic = RichTextField(blank=False, null=True)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "Ենթաբաժին"
        verbose_name_plural = "Ենթաբաժիններ"

2. 修正模板代码

修改type.html,修正上下文变量、语法错误和字段调用:

{% extends 'base.html' %}
{% load static %}

{% block content %}

<!-- 正确调用ImageField的url属性 -->
<img src="{{ cancertype.image.url }}">
<h4>{{ cancertype.name }}</h4>
<br>
{{ cancertype.description|safe }}
<br>

<!-- 通过反向关联获取当前癌症类型的所有子主题 -->
{% for subtopic in cancertype.subtopics.all %}
    <h5>{{ subtopic.title }}</h5>
    <hr>
    <!-- 调用正确的字段名topic,并添加safe过滤器渲染富文本 -->
    {{ subtopic.topic|safe }}
{% endfor %}

{% endblock %}

注:如果没添加related_name,则把cancertype.subtopics.all改成cancertype.subtopic_set.all即可。

3. 额外修正:图片路径问题

原模板中{% url 'home' %}{{ cancertype.image }}的写法错误,Django的ImageField自带url属性,直接调用{{ cancertype.image.url }}就能获取正确的图片访问路径。

验证效果

重启Django服务后,访问单个癌症类型的详情页,就能看到该类型下关联的所有子主题内容了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:05:23