You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

补充说明

  1. 如果你不想指定name参数,直接用函数名作为过滤器名,也可以写成@register.filter(),这样模板里依然可以用|rep_slash调用。
  2. 你的项目结构kjp_app/templatetags/__init__.py+myfilters.py是完全正确的,__init__.py可以是空文件,确保Django能识别这个模板标签包。
  3. 模板里的{% load myfilters %}和过滤器使用方式{{ rec.client_designation|rep_slash }}是没问题的,只要过滤器注册正确就能正常工作。

内容的提问来源于stack exchange,提问作者Amal Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:42:50