如何在Django模板中向include传递extends中的块变量?
解决方案
方案一:利用块内容赋值给模板变量(推荐)
修改main.html,将块的内容捕获到变量中,再传递给include的模板:
<html> <body> {% block title %}default title{% endblock %} <!-- 将块内容赋值给变量 --> {% with page_title=block.title %} <p> This works: {{ page_title }} </p> {% include 'heading.html' with title=page_title %} {% endwith %} </body> </html>
page.html保持原有写法即可:
{% extends 'main.html' %} {% block title %}test title{% endblock %}
渲染时,block.title会获取到子模板中覆盖的test title,赋值给page_title后就能传递给heading.html,同时页面显示的标题也保持一致。
方案二:子模板中定义变量+块关联
如果觉得方案一的写法有点绕,可以在子模板里先定义变量,再让块引用这个变量,父模板直接使用变量传递:
page.html修改为:
{% extends 'main.html' %} <!-- 定义变量 --> {% with page_title="test title" %} {% block title %}{{ page_title }}{% endblock %} {% endwith %}
main.html调整为:
<html> <body> <p> This works: {% block title %}{% endblock %} </p> <!-- 直接使用子模板定义的变量 --> {% include 'heading.html' with title=page_title %} </body> </html>
这种方式逻辑更直观,子模板里的变量和块关联,避免重复写标题内容。
方案三:将include嵌入块中(适合简单场景)
如果heading.html只用于展示标题,可以直接把include放到title块里,但这种方式会让块的职责更模糊,适合结构简单的场景:
main.html修改为:
<html> <body> <p> This works: {% block title %}{% endblock %} </p> {% block heading %} {% include 'heading.html' with title=block.super %} {% endblock %} </body> </html>
page.html保持不变,渲染时block.super会获取到title块的内容传递给heading.html。
内容的提问来源于stack exchange,提问作者Xilexio
相关产品推荐
相关产品推荐

