Django模板:如何将block数据传递给被包含的模板?
Django嵌套模板中让include的子模板显示父模板block内容的解决方法
问题原因
{% include %}标签是独立渲染目标模板,子模板(child.html)内的{% block %}不会自动继承当前模板(main.html)中同名block的内容,只会使用自身block的默认值,这就是为什么你看到的是child.html里的内容而非main.html的"NOT SHOWN DATA"。
解决方案
方法1:通过模板变量传递内容(推荐)
在main.html的include标签里,把父模板block的内容以变量形式传给子模板:
{% block main_block %} some_data {% include "child.html" with include_content=block.super %} some_data {% endblock %}
然后修改child.html,直接使用传递过来的变量(如果需要保留block结构,也可以在block内渲染变量):
<div> <tags></tags> <!-- 直接用变量 --> {{ include_content }} <!-- 或者保留block结构,变量优先,无变量时用默认值 --> {% block include_data %} {{ include_content|default:"that will shown, but i wanna to be shown 'NO SHOWN DATA'" }} {% endblock %} </div>
方法2:调整模板继承结构
如果你的子模板需要频繁复用父模板的block内容,可以把child.html改为继承包含目标block的模板,比如让child.html继承main.html(但这种方式可能会导致模板层级变复杂,适合特定场景):
修改child.html:
{% extends "main.html" %} <div> <tags></tags> {% block include_data %} {{ block.super }} {% endblock %} </div>
然后在main.html里不需要用include,而是通过block来填充,但这种方式需要调整原有的模板布局,不如方法1灵活。
关键说明
block.super用于引用父模板中当前block的内容,在main.html里使用它可以获取{% block include_data %}里的"NOT SHOWN DATA"。{% include ... with %}是给子模板传递上下文变量的标准方式,能让子模板复用父模板的指定内容,同时保持子模板的独立性。
内容的提问来源于stack exchange,提问作者Yuretz
相关产品推荐
相关产品推荐

