Jinja宏自动生成章节与子章节编号时非命名空间对象赋值报错如何解决
问题根因
- 变量存在性判断逻辑错误:原有代码用
is none判断变量是否存在,若变量完全未定义时该判断会直接抛出未定义错误,而非进入初始化分支。 - 块级作用域问题:Jinja中
set定义的变量默认只在当前代码块生效,你在if分支内部初始化的namespace对象,出了if分支后就会失效,后续访问到的还是未定义变量,自然无法对其属性赋值。 - 缺少状态持久化配置:未指定变量为全局作用域,每次调用宏时变量都会被重置,无法实现章节号累加的效果。
- 原有逻辑遗漏了一级章节更新后重置二级章节编号的处理,会出现二级章节序号连续累加的异常。
修复后的完整宏代码
{% macro getsectionnumber(type) -%} {# 最外层优先初始化全局命名空间变量,避免块级作用域问题 #} {% if sectionnumber is not defined %} {% set global sectionnumber = namespace(value=0) %} {% endif %} {% if subsectionnumber is not defined %} {% set global subsectionnumber = namespace(value=0) %} {% endif %} {% if type == 'section' %} {% set sectionnumber.value = sectionnumber.value + 1 %} {# 新一级章节开启时重置子章节编号 #} {% set subsectionnumber.value = 0 %} {{ sectionnumber.value }} {% endif %} {% if type == 'subsection' %} {% set subsectionnumber.value = subsectionnumber.value + 1 %} {{ sectionnumber.value }}.{{ subsectionnumber.value }} {% endif %} {%- endmacro %}
使用示例
<!-- 调用示例 --> <h2>{{ getsectionnumber('section') }} 安装部署指南</h2> <p>本章节介绍产品的安装流程</p> <h3>{{ getsectionnumber('subsection') }} 环境要求</h3> <p>服务器配置最低要求为2核4G内存</p> <h3>{{ getsectionnumber('subsection') }} 安装步骤</h3> <p>执行`pip install xxx`完成安装</p> <h2>{{ getsectionnumber('section') }} 使用教程</h2> <h3>{{ getsectionnumber('subsection') }} 基础功能操作</h3>
渲染后输出的编号为:
1 安装部署指南 1.1 环境要求 1.2 安装步骤 2 使用教程 2.1 基础功能操作
内容的提问来源于stack exchange,提问作者Jamie Dunbar
相关产品推荐
相关产品推荐

