Django自定义模板过滤器报错:TypeError: 'Library' object is not callable
解决Django模板过滤器注册时的
TypeError: 'Library' object is not callable错误 嘿,我一眼就看出问题出在哪了——你注册模板过滤器的语法错了!Django的template.Library实例本身不能直接当装饰器用,得用它的filter()方法才行。
错误原因
你写的@register(name='rep_slash')是不对的,register是Library类的实例,它本身不可调用,正确的做法是用register.filter()这个装饰器来注册你的过滤器函数。
另外,你的过滤器函数里还有个逻辑小问题:if '' in value:这个判断永远为True,因为任何字符串都包含空字符串,执行value.replace('','/')会把字符串的每个字符前后都插入/,比如输入"CEO"会变成"/C/E/O/",这估计不是你想要的效果,我后面也会给你修正建议。
修正后的代码
把你的myfilters.py改成下面这样:
from django import template register = template.Library() # 用register.filter()装饰器,而不是直接调用register @register.filter(name='rep_slash') def rep_slash(value): # 修正逻辑:如果是要替换某个特定字符(比如下划线),改成下面的样子 # 示例:把下划线替换成斜杠 # return value.replace('_', '/') # 如果你的需求确实和空串相关,建议先判断value是否为空 if value: return value.replace('', '/') return value
补充说明
- 如果你不想指定
name参数,直接用函数名作为过滤器名,也可以写成@register.filter(),这样模板里依然可以用|rep_slash调用。 - 你的项目结构
kjp_app/templatetags/__init__.py+myfilters.py是完全正确的,__init__.py可以是空文件,确保Django能识别这个模板标签包。 - 模板里的
{% load myfilters %}和过滤器使用方式{{ rec.client_designation|rep_slash }}是没问题的,只要过滤器注册正确就能正常工作。
内容的提问来源于stack exchange,提问作者Amal Raj
相关产品推荐
相关产品推荐

