django模板中的filter只能支持一个附加参数

本文探讨了Django模板过滤器(filter)只能接受一个额外参数的问题,详细解析了`django/template/__init__.py`中的相关正则表达式,并指出参数可以是i18n字符串、常量字符串或Python变量。由于官方文档未及时更新,作者提出通过包装参数为list或dict作为变通方案,但这违背了filter的使用初衷。总结了Django模板的灵活性与局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     想自定义一个复杂一点的filter,折腾了很久,刷新网页看效果,始终不能成功。于是打开django的代码查看,发现根本就不能支持多个参数 .解析模板文件是在${django}/template/__init__.py文件里面,这里定义了一个正则字符串 filter_raw_string ,这个字符串展开如下
^ _( " (?P<i18n_constant>[^ " /] * (?:/.[ ^ " /]*)*) " ) |
^ " (?P<constant>[^ " /] * (?:/.[ ^ " /]*)*) " |
^ (?P < var > [A - Za - z0 - 9 _.] + ) |
 (?:
|
     (?P
< filter_name > w + )
         (?::
             (?:
              _(
" (?P<i18n_arg>[^ " /] * (?:/.[ ^ " /]*)*) " ) |
              
" (?P<constant_arg>[^ " /] * (?:/.[ ^ " /]*)*) " |
              (?P
< var_arg > [A - Za - z0 - 9 _.] + )
             )
         )?
 )

从里面可以不难看出一个filter,只能带1个额外参数(这个参数可以为3种类型之一,3种类型分别是 i18字符串,常量字符串,和python 变量),因为filter本身是{{variable|filter:arg}}这样的用法,具体到filter的实现函数里面,最多可以有两个参数。
i18字符串:就是_("xxx")这样的国际化字符串,_()是django提供的一个函数,来源显然是 GNU gettext
常量字符串:就是普通的字符串
python 变量:python中任意类型(对象)的实例  
   因为也可以支持python 变量(www.djangoproject.com的文档部分没有及时更新,现在还写着只能支持带双引号的参数形式(就是指常量字符串)),所以如果想要在filter里面传入多个变量,可以有一个变通的方法,把你需要传入的参数,包装成一个list,或者dict,再作为filter的参数,而这个包装只能写在框架的view部分,这样做,就失去了使用filter的初衷。
    django的template还是很好用的,但是需求会不断变化,所以还是不够灵活强大,这点也算是这个漂亮web框架的一些瑕疵吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值