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

来源:互联网 发布:提升英语水平的软件 编辑:程序博客网 时间:2024/06/06 12:51
     想自定义一个复杂一点的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框架的一些瑕疵吧
原创粉丝点击