当前位置:  开发笔记 > 编程语言 > 正文

如何在django模板中向自定义模板过滤器添加多个参数?

如何解决《如何在django模板中向自定义模板过滤器添加多个参数?》经验,为你挑选了4个好方法。

这是可能的,也很简单.

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()以删除任何前导和尾随空格.

例如,如果第三个参数是一个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 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',''))

这看起来很有帮助,但我无法让它与传递的变量一起工作.为此,我使用了`tag`或`simple_tag` - 它允许传递多个变量,甚至命名变量. (2认同)


Jeff Bauer.. 17

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

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

变量(输入)的值 - 不一定是字符串.

参数的值 - 这可以有一个默认值,或者完全省略.


小智.. 12

这很容易.

@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 }}


dragonroot.. 10

而不是过滤器,将您的标签注册为简单标签.那些可以采取多种论点.调用它的语法会有所不同,但这只是语法糖的变化.



1> Van Gale..:

这是可能的,也很简单.

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()以删除任何前导和尾随空格.

例如,如果第三个参数是一个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 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',''))


这看起来很有帮助,但我无法让它与传递的变量一起工作.为此,我使用了`tag`或`simple_tag` - 它允许传递多个变量,甚至命名变量.

2> Jeff Bauer..:

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

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

变量(输入)的值 - 不一定是字符串.

参数的值 - 这可以有一个默认值,或者完全省略.



3> 小智..:

这很容易.

@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> dragonroot..:

而不是过滤器,将您的标签注册为简单标签.那些可以采取多种论点.调用它的语法会有所不同,但这只是语法糖的变化.


这是我的问题的正确答案.为了将模板变量传递给这个函数,我不得不使用`simple_tag`.
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有