如何在HTML模板中调用Django Admin的StackedInline关联模型数据?
Django DetailView模板无法显示关联子主题的解决方案
问题背景
在Django Admin中通过StackedInline为CancerType(癌症类型)模型关联SubTopic(子主题)模型,后台创建/编辑操作正常,但在SingleType(DetailView视图)对应的type.html模板中,无法显示当前癌症类型关联的子主题数据。
错误原因分析
- 模板上下文变量错误:
SingleType是DetailView,传递给模板的是单个CancerType实例(默认变量名object或cancertype),但模板里误用了ListView专属的object_list变量,导致无法获取当前实例的关联数据。 - 反向关联调用错误:未正确使用Django的反向关联查询来获取当前癌症类型的子主题。
- 模板语法错误:循环、条件语句多写了闭合的
},导致模板解析异常。 - 字段名匹配错误:
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
相关产品推荐
相关产品推荐

