Wagtail模板无法渲染Orderable关联Snippet列表问题
问题根因
Snippet无法渲染完全是模板字段引用错误导致的,你的模型定义、后台配置逻辑都没问题,一共3处错误:
- 反向关联名写错:
CategoriasOrdenables中间表的ParentalKey定义里,给BlogDetailPage设置的反向关联名是categorias(related_name="categorias"),你详情页模板写的self.categoria.all根本匹配不到关联关系,拿不到数据 - 关联属性写错:你之前尝试把关联名改成
categorias之后,循环内部取Snippet字段时又写错了——中间表指向分类Snippet的外键字段名是categoria,不是categorias,iter.categorias.name是不存在的无效属性 - 上下文对象写错:首页模板在
{% for post in posts %}循环内部,你写的是self.categoria.all,这里的self指代的是当前渲染的HomePage首页实例,不是循环里的单篇博客post对象,自然不可能拿到对应博客关联的分类
修复方案
1. 修改博客详情页模板(home/blog_detail_page.html)
将原Snippet渲染区块替换为以下代码,同时删掉区块下方多余的孤立</p>标签,避免HTML结构异常:
<ul> {% for iter in self.categorias.all %} <li> {{ iter.categoria.name }} </li> {% endfor %} </ul>
2. 修改首页模板(home/home_page.html)
将原Snippet渲染区块替换为以下代码,注意从循环变量post上取关联数据,不要用self:
{% for iter in post.categorias.all %} {{ iter.categoria.name }} {% endfor %}
改完重启Django服务刷新页面即可正常显示分类列表:
- 详情页场景下
self对应当前访问的BlogDetailPage实例,通过反向关联categorias拿到所有关联的中间表记录,每条记录的categoria属性就是绑定的分类Snippet对象,直接取name就能拿到分类名称 - 首页列表场景下,每轮循环的
post是单篇BlogDetailPage实例,同样通过post.categorias就能拿到该篇博客绑定的所有分类
内容的提问来源于stack exchange,提问作者Squall32
相关产品推荐
相关产品推荐

