101

这是我的自定义过滤器:

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 的文档书籍,但只找到了使用单个参数的示例......甚至可能吗?

4

9 回答 9

113

这是可能的并且相当简单。

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',''))
于 2009-01-08T02:35:47.863 回答
25

像这样很容易。

@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 }}
于 2014-06-25T07:26:45.503 回答
19

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

于 2014-01-24T14:34:52.333 回答
19

它比您想象的要简单 您可以为此

使用simple_tag 。

from django import template
register = template.Library()

@register.simple_tag
def multiple_args_tag(a, b, c, d):
   #do your stuff
   return 

在模板中

{% multiple_args_tag 'arg1' 'arg2' 'arg3' 'arg4' %}

注意:不要忘记重新运行服务器。

于 2020-04-07T10:56:42.347 回答
17

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

自定义过滤器只是接受一两个参数的 Python 函数:

  • 变量(输入)的值——不一定是字符串。
  • 参数的值——这可以有一个默认值,或者完全省略。
于 2009-01-07T15:34:57.930 回答
3

此功能已在 2013 年 Django 的 Trac 中标记为 WONTFIX:http: //code.djangoproject.com/ticket/1199

于 2009-01-07T15:32:35.423 回答
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" }}
于 2010-04-08T13:16:58.760 回答
-1

你可以简单地这样做:

{% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %}

public static List<object> Find(object collection, string column, string value)

它将到达目的地,因为函数的抽象是sjare

于 2018-09-28T07:52:03.110 回答
-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)
于 2009-03-13T20:08:44.317 回答