模板继承:如何实现父模板向子模板传递数据(通用HTML表格场景)
如何在Jinja2模板继承中传递循环上下文到子模板?
哎,其实你已经离成功只差一步啦!Jinja2的模板继承机制里,子模板的块是直接共享父模板当前渲染上下文的——也就是说,父模板循环里的elt变量,在子模板的table_td块里是可以直接访问的,根本不需要额外传递!
先修正父模板的小笔误
你父模板里写的el.value应该是elt.value(循环变量是elt),先调整一下generic_table.html:
<table class="table"> <tbody> {% for elt in table %} <tr> {% block table_td %} <td>{{ elt.value }}</td> {% endblock %} </tr> {% endfor %} </tbody> </table>
子模板直接使用循环变量
接下来在子模板里,你可以直接用elt来获取当前行的ID或者其他字段,比如给按钮加上对应ID:
{% extends "generic_table.html" %} {% block table_td %} {{ super() }} <!-- 保留父模板的原有列 --> <td> <button>编辑 #{{ elt.id }}</button> </td> <td> <button>删除 #{{ elt.id }}</button> </td> {% endblock table_td %}
原理说明
Jinja2的块不是孤立执行的,它会嵌入到父模板的渲染流程中。当父模板循环到某一个elt时,子模板的table_td块会在这个循环的上下文里运行,所以elt这个变量完全是可用的——就像你在父模板的循环里直接写代码一样。
如果之后你需要传递更多自定义变量,也可以在父模板的循环里用{% set %}声明变量,子模板同样能直接访问到这些变量哦。
内容的提问来源于stack exchange,提问作者Théo Le
相关产品推荐
相关产品推荐

