如何在Django模板的自定义模板过滤器中添加多个参数?
这是我的自定义过滤器:
from django import templateregister = 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的文档和书籍,但只发现了使用单个参数的示例……甚至可能吗?
回答:
这是可能的并且相当简单。
Django只允许在过滤器中使用一个参数,但是没有理由不能使用逗号将所有参数都放在一个字符串中。
因此,例如,如果你需要一个过滤器来检查变量X是否在列表[1,2,3,4]中,则需要一个如下所示的模板过滤器:
{% if X|is_in:"1,2,3,4" %}
现在,我们可以像这样创建你的templatetag:
from django.template import Libraryregister = 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()以删除任何前导和尾随空格。
例如,如果第三个参数是int,则只需执行以下操作:
arg_list[2] = int(arg_list[2])
或者如果它们都是整数,则执行以下操作:
arg_list = [int(arg) for arg in args.split(',')]
编辑:现在通过使用键,值对作为参数来专门回答你的问题,你可以使用Django用于解析URL之外的查询字符串的同一类,这也具有根据你的settings.py正确处理字符编码的好处。 。
因此,与查询字符串一样,每个参数都用’&’分隔:
{{ attr.name|replace:"cherche=_&remplacement= " }}
然后,你的替换函数将如下所示:
from django import templatefrom 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',''))
以上是 如何在Django模板的自定义模板过滤器中添加多个参数? 的全部内容, 来源链接: utcz.com/qa/430879.html