首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Django模板中向自定义模板筛选器添加多个参数?

如何在Django模板中向自定义模板筛选器添加多个参数?
EN

Stack Overflow用户
提问于 2018-04-08 00:58:26
回答 2查看 0关注 0票数 0

custom filter:

代码语言:txt
复制
from django import template

register = template.Library()

@register.filter
def replace(value, cherche, remplacement):
    return value.replace(cherche, remplacement)

下面是我尝试在模板文件中使用它导致错误的方法:

代码语言:txt
复制
{{ attr.name|replace:"_"," " }}
{{ attr.name|replace:"_" " " }}
{{ attr.name|replace:"_":" " }}
{{ attr.name|replace:"cherche='_', remplacement=' '" }}
EN

回答 2

Stack Overflow用户

发布于 2018-04-08 09:54:21

Django只允许你的过滤器有一个参数,但没有理由不能用逗号分隔所有参数到单个字符串中。

因此,例如,如果你想要一个过滤器来检查变量X是否在列表[1,2,3,4]中,你将需要一个如下所示的模板过滤器:

代码语言:javascript
运行
复制
{% if X|is_in:"1,2,3,4" %}

现在我们可以像这样创建你的模板标签:

代码语言:javascript
运行
复制
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,那么就这样做:

代码语言:javascript
运行
复制
arg_list[2] = int(arg_list[2])

或者,如果他们都是ints做:

代码语言:javascript
运行
复制
arg_list = [int(arg) for arg in args.split(',')]

编辑:现在通过使用键值对作为参数来具体回答你的问题,你可以使用Django使用的相同类来解析URL中的查询字符串,然后根据你的settings.py正确地处理字符编码。 。

因此,与查询字符串一样,每个参数都用'&'分隔:

代码语言:javascript
运行
复制
{{ attr.name|replace:"cherche=_&remplacement= " }}

那么你的替换函数现在看起来像这样:

代码语言:javascript
运行
复制
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

你可以加快速度,做一些不正确的替换:

代码语言:javascript
运行
复制
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))
票数 0
EN

Stack Overflow用户

发布于 2018-04-08 10:32:02

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

  • 变量(输入)的值:不一定是一个字符串。
  • 参数的值:这可以有一个默认值,或完全省略。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档