如何在django模板中将多个参数添加到我的自定义模板filter中?

这是我的自定义filter:

from django import template register = template.Library() @register.filter def replace(value, cherche, remplacement): return value.replace(cherche, remplacement) 

这里是我尝试在我的模板文件中使用它导致错误的方法:

 {{ attr.name|replace:"_"," " }} {{ attr.name|replace:"_" " " }} {{ attr.name|replace:"_":" " }} {{ attr.name|replace:"cherche='_', remplacement=' '" }} 

我看了一下django的文档和书,但是只用一个参数find了一个例子……甚至有可能吗?

这是可能的,相当简单。

Django只允许一个参数给你的filter,但没有理由不能把你所有的参数放在一个单独的string中,用逗号分隔它们。

例如,如果你想要一个filter来检查variablesX是否在列表[1,2,3,4]中,你需要一个如下的模板filter:

 {% if X|is_in:"1,2,3,4" %} 

现在我们可以像这样创build您的模板标签:

 from django.template import Library register = Library() def is_in(var, args): if args is None: return False arg_list = [arg.strip() for arg in args.split(',')] return var in arg_list register.filter(is_in) 

创buildarg_list的行是一个生成器expression式,它将所有逗号上的argsstring分开,并调用.strip()以除去任何前导和尾随空格。

例如,如果第三个参数是一个int,那么就这样做:

 arg_list[2] = int(arg_list[2]) 

或者,如果他们全都是做:

 arg_list = [int(arg) for arg in args.split(',')] 

编辑:现在通过使用键,值对作为参数来具体回答你的问题,你可以使用Django使用相同的类来parsingURL的查询string,然后也有根据你的settings.py正确处理字符编码的好处。

所以,与查询string一样,每个参数都用'&'分隔:

 {{ attr.name|replace:"cherche=_&remplacement= " }} 

那么你的replace函数现在看起来像这样:

 from django import template from django.http import QueryDict register = template.Library() @register.filter def replace(value, args): qs = QueryDict(args) if qs.has_key('cherche') and qs.has_key('remplacement'): return value.replace(qs['cherche'], qs['remplacement']) else: return value 

你可以加快一些风险做一些不正确的replace:

 qs = QueryDict(args) return value.replace(qs.get('cherche',''), qs.get('remplacement','')) 

根据文档的这一部分不可能:

自定义filter只是带有一个或两个参数的Python函数:

  • variables的值(input) – 不一定是一个string。
  • 参数的值 – 这可以有一个默认值,或完全省略。

将标签注册为简单标签,而不是filter。 这些可以采取多个参数。 调用它的语法会有点不同,但这只是语法糖的变化。

这很容易。

 @register.filter(name='one_more') def one_more(_1, _2): return _1, _2 def your_filter(_1_2, _3) _1, _2 = _1_2 print "now you have three arguments, enjoy" {{ _1|one_more:_2|your_filter:_3 }} 

<我的站点> /globaltags/replace.py

 from django.template import Library import re register = Library() def search(value, search): return re.sub(search, '#f4x@SgXXmS', value) def replace(value, replace): return re.sub('#f4x@SgXXmS', replace, value) register.filter(search) register.filter(replace) 

在模板中:

 {{ "saniel"|search:"s"|replace:"d" }} 

这个特性在2013 Django的Trac中被标记为WONTFIX: http ://code.djangoproject.com/ticket/1199

这是一个坏主意,但作品:

 {{ xml|input_by_xpath:"{'type':'radio','xpath':'//result/value'}" }} 

 @register.filter def input_by_xpath(device, args): args = eval(args) ... result = "<input type=\"%s\" value=\"%s\" name=\"%s\"/>"%(args['type'],value,args['xpath']) return mark_safe(result)