Django模板出现Invalid filter: 'length_is'错误,求解决方法
解决Django 5.1中
length_is过滤器的TemplateSyntaxError问题 关于length_is过滤器的说明
Django官方标准模板过滤器中没有length_is,它大概率是某个第三方库(如早期版本的django-jazzmin或其他Admin美化库)曾经提供的自定义过滤器,或是项目历史中存在但现在被移除的自定义过滤器。你排查后未找到它的定义,说明要么依赖库版本更新后移除了该过滤器,要么旧的自定义过滤器代码被删除/遗漏。
快速替代方案(无需自定义过滤器)
直接用Django自带的length过滤器结合模板比较语法替换原代码,效果完全一致:
将原代码中的
line.fields|length_is:'1'
替换为
line.fields|length == 1
比如原模板中的判断逻辑如果是:
{% if line.fields|length_is:'1' %} ... {% endif %}
改成:
{% if line.fields|length == 1 %} ... {% endif %}
自定义实现length_is过滤器(如需保留原写法)
如果必须保留length_is这个过滤器名称,自己实现一个很简单:
- 在你的任意Django app下创建
templatetags目录,同时在该目录下创建__init__.py空文件(让Python识别为包) - 在
templatetags目录下新建custom_filters.py文件,写入以下代码:from django import template register = template.Library() @register.filter(name='length_is') def length_is(value, target_length): # 处理非可迭代对象或参数无法转成整数的情况 try: return len(value) == int(target_length) except (TypeError, ValueError): return False - 在使用该过滤器的模板文件开头加载自定义过滤器:
{% load custom_filters %}
之后就能正常使用line.fields|length_is:'1'了。
版本与配置排查建议
- 检查django-jazzmin版本:如果你的Admin用了jazzmin,可能旧版本的jazzmin内置了
length_is过滤器,但适配Django 5.x的新版本移除了它。可以尝试回退到兼容的jazzmin版本,或者直接用上面的替代方案。 - 确认项目配置:检查INSTALLED_APPS中是否包含了原本提供该过滤器的app,或是是否有自定义过滤器文件被.gitignore忽略、未被正确加载。
内容的提问来源于stack exchange,提问作者Luka Guledani
相关产品推荐
相关产品推荐

