Django能否在父模板base.html中判断content块是否为空并设置默认内容
Django模板继承实现父模板块默认内容方案
该需求完全可以实现,仅修改父模板base.html即可,无需改动任何子模板。
原生实现方案(适用于99%场景)
Django模板继承原生支持块默认值机制,不需要额外写判断逻辑,直接把默认内容写在父模板的content块内即可:
{# base.html 代码 #} {% block content %} <p>默认内容</p> {% endblock content %}
生效规则
- 子模板没有重写
content块时,页面自动渲染父模板中定义的默认内容 - 子模板重写了
content块时,页面优先渲染子模板定义的内容
你之前设想的{% if block content is None %}语法是Django模板不支持的无效写法,也不需要写这类判断,原生的块默认机制已经完全匹配你的需求。
特殊场景兼容
如果你的项目中存在部分子模板虽然重写了content块,但是块内没有有效内容(仅为空行、空格),想要这类场景也触发默认内容显示,可以自定义一个模板过滤器校验块渲染结果:
- 先自定义空内容判断过滤器
# 你应用下的templatetags/custom_filters.py from django import template from django.utils.html import strip_tags register = template.Library() @register.filter def is_empty(content): return not strip_tags(content).strip()
- 父模板代码调整为:
{% load custom_filters %} {% filter is_empty as content_is_empty %} {% block content %}{% endblock %} {% endfilter %} {% if content_is_empty %} <p>默认内容</p> {% else %} {% block content %}{% endblock %} {% endif %}
这个方案可以兼容子模板空块的场景,依然不需要修改任何子模板。
内容的提问来源于stack exchange,提问作者penk
相关产品推荐
相关产品推荐

