如何在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)
- Django Rest框架:dynamic返回字段的子集
- 你如何在Django中序列化模型实例?
- ValueError at / image / Tensor张量(“activation_5 / Softmax:0”,shape =(?,4),dtype = float32)不是该图的元素
- 使用Django生成要下载的文件
- Mac OS X – EnvironmentError:找不到mysql_config
- 如何在Django模型上存储字典?
- Django:'current_tags'不是一个有效的标签库
- 使用Django的HTTPError 403(Forbidden)和使用OAuth2连接到Google的python-social-auth
- Django查询:如何筛选对象以排除列表中的ID?