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's docs和book,但只找到了使用单个参数的示例......它甚至可能吗?
答案 0 :(得分:97)
这是可能而且相当简单。
Django只允许你的过滤器使用一个参数,但没有理由你不能使用逗号将所有参数放入单个字符串中来分隔它们。
因此,例如,如果您想要一个过滤器来检查变量X是否在列表[1,2,3,4]中,您将需要一个如下所示的模板过滤器:
{% if X|is_in:"1,2,3,4" %}
现在我们可以像这样创建你的模板标签:
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)
创建arg_list的行是一个生成器表达式,它在所有逗号上拆分args字符串并调用.strip()来删除任何前导和尾随空格。
例如,如果第3个参数是int,则只需执行:
arg_list[2] = int(arg_list[2])
或者如果所有这些都是ints:
arg_list = [int(arg) for arg in args.split(',')]
编辑:现在通过使用键值对作为参数来专门回答你的问题,你可以使用Django用来解析URL的查询字符串的同一个类,然后还可以根据你的需要正确处理字符编码。 settings.py。
因此,与查询字符串一样,每个参数都以'&'分隔:
{{ attr.name|replace:"cherche=_&remplacement= " }}
然后你的替换功能现在看起来像这样:
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
你可能会冒一些不正确的替换风险来提高速度:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))
答案 1 :(得分:16)
答案 2 :(得分:10)
将标记注册为简单标记,而不是过滤器。那些可以采取多种论点。调用它的语法会有所不同,但这只是语法糖的变化。
答案 3 :(得分:9)
这很容易。
@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 }}
答案 4 :(得分:6)
它比您想象的要简单
您可以为此使用 simple_tag 。
@register.simple_tag
def multiple_args_tag(a, b, c, d):
#do your stuff
return
在模板中:
{% multiple_args_tag 'arg1' 'arg2' 'arg3' 'arg4' %}
注意:不要忘记重新运行服务器。
答案 5 :(得分:4)
此功能在2013年被标记为WONTFIX Django的Trac:http://code.djangoproject.com/ticket/1199
答案 6 :(得分:2)
<强>&LT;我的现场&GT; /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" }}
答案 7 :(得分:-1)
您可以简单地做到这一点:
{% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %}
public static List<object> Find(object collection, string column, string value)
当函数的抽象为sjare
时,它将到达目的地。
答案 8 :(得分:-2)
这是一个坏主意,但有效:
{{ 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)