Django条件渲染最佳实践:视图返回多模板还是模板内做分支?
两种实现方案的优劣对比
方案1:View层判断数据存在性,分模板渲染
指在views.py中判断数据是否存在,有数据渲染正常业务模板,无数据渲染专属空状态模板的实现方式。
- 优势
- 逻辑拆分清晰,空状态模板和正常业务模板完全解耦,适合两类页面结构差异极大的场景
- 空状态的专属业务逻辑可以放在View层统一处理,比如为空用户推送引导操作、个性化推荐内容,不需要把复杂逻辑塞进模板
- 适合空状态需要独立做埋点、权限控制、AB测试的场景,不需要污染正常页面的代码逻辑
- 劣势
- 多维护一个模板文件,如果两个模板有共用的头部、尾部等公共组件,会产生冗余代码,后期修改公共部分需要同步更新两份文件
- 写法不当会产生额外查询:如果用
books.exists()做判断,后续渲染模板时ORM会再做一次实际数据查询,产生两次查询请求;该问题可优化为直接用if books:判断,利用QuerySet惰性查询的特性复用缓存结果,避免重复查询 - 小场景下冗余:如果只是列表区域显示空提示,页面其他部分和正常状态完全一致,拆分模板反而会增加维护成本
方案2:单模板内通过分支判断处理
指在同一个模板中用{% if not books %}或者Django原生的{% empty %}标签,分别渲染正常内容和空状态内容的实现方式。
- 优势
- 符合Django模板系统的设计初衷,
{% empty %}就是官方为可迭代对象为空的场景设计的专用标签,语法简洁,是绝大多数场景下的默认最佳实践 - 公共组件可以共用,不需要重复编写头部、尾部、侧边栏等公共内容,后期维护只需要修改一个模板
- 只会产生一次数据查询,不需要额外的存在性判断,性能更优
- 逻辑内聚,列表展示和对应的空状态逻辑放在同一位置,排查问题不需要同时翻View层和多个模板文件
- 符合Django模板系统的设计初衷,
- 劣势
- 如果空状态和正常页面的结构差异极大,模板内会充斥大量分支判断,可读性大幅下降,后期维护成本变高
- 复杂的空状态业务逻辑不适合放在模板里,Django模板语法限制多,复杂运算、权限判断、数据处理放在模板里会违背MTV的分层原则
适用场景选择
- 优先选方案2的情况:
- 空状态只是列表区域的局部提示,页面其他结构和正常状态完全一致
- 空状态逻辑简单,只需要展示提示文案、引导按钮,不需要复杂的业务处理
- 项目属于中小型、迭代速度快,不想维护多份冗余模板
- 优先选方案1的情况:
- 空状态页面和正常列表页的结构完全不同,比如空状态是独立的新手引导页,有独立的排版、交互、运营位,几乎没有和正常页面共用的内容
- 空状态需要做大量独立的业务逻辑处理,这些逻辑放在View层更符合分层规范
- 空状态页面需要单独做路由、埋点、AB测试,拆分模板更方便独立迭代
内容的提问来源于stack exchange,提问作者pegawol169
相关产品推荐
相关产品推荐

