Jinja&Django模板报错:无效块标签'set',变量递增失败
解决Django模板中{% set %}标签报错的问题
你这是踩了Django模板语言和Jinja2的语法差异坑啦!报错提示的"Invalid block tag : 'set'",核心原因是Django默认的模板引擎根本不支持{% set %}这个标签——它是Jinja2专属的语法,和你有没有安装Jinja完全没关系,之前代码正常只是因为没用到这个Jinja特有的标签而已。
给你两个实用的解决方案,按需选择:
方案一:用Django原生循环计数(最省心)
既然你是要在for循环里实现递增计数,完全不用手动设置变量!Django的for循环自带forloop.counter属性,它会从1开始自动递增,正好匹配你的需求。
把模板代码改成这样就行:
{% for form in formset %} <tr style="border:1px solid black;" id="{{ form.prefix }}-row" class="dynamic-form"> <td><div class="col-xs-1"><b><p name="np1">{{ forloop.counter }}</p></b></div></td> <!-- 你的其他表单内容 --> </tr> {% endfor %}
直接删掉{% set count = 1 %},把原来的{{ count }}换成{{ forloop.counter }},不用改任何配置,完美解决计数问题。
方案二:配置Django使用Jinja2模板引擎
如果你确实需要用Jinja2的灵活语法(比如更自由的变量操作),可以在Django里配置双模板引擎:
- 修改项目根目录的
settings.py,更新TEMPLATES配置,添加Jinja2的引擎项:
import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent TEMPLATES = [ # Jinja2模板引擎配置 { 'BACKEND': 'django.template.backends.jinja2.Jinja2', 'DIRS': [os.path.join(BASE_DIR, 'templates/jinja2')], # 存放Jinja模板的目录 'APP_DIRS': True, 'OPTIONS': { # 可选:自定义Jinja环境,比如添加全局变量/过滤器 # 'environment': 'your_project_name.jinja2.environment', }, }, # 保留默认Django模板引擎,处理admin等原生模板 { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
- 把用到
{% set %}的模板文件放到templates/jinja2目录下,Django就会自动用Jinja2引擎解析它了。
额外小提示
如果只是需要在Django原生模板里临时定义一个只读变量,可以用{% with %}标签,比如:
{% with count=1 %} <p>初始值:{{ count }}</p> {% endwith %}
但这个变量无法修改,所以循环递增的场景还是forloop.counter最靠谱。
内容的提问来源于stack exchange,提问作者Elroum
相关产品推荐
相关产品推荐

