Django - 具有多个参数的过滤器

Posted

技术标签:

【中文标题】Django - 具有多个参数的过滤器【英文标题】:Django - filter with multiple para 【发布时间】:2018-04-11 22:06:15 【问题描述】:

我正在尝试创建具有多个参数的过滤器。我发现this link的第一个答案很有用,所以采纳了他的想法。

但是,我不知道如何创建一个包含所有值的字符串变量。这是我的代码:

% with amount_comments|to_string+","+limit_amount_comments|to_string as args %
    % if page_nr|page_not_over_amount:args %
        <a href="% url 'post:detail' topic.id page_nr|increase:1 %">Next Page</a>
    % endif %
% endwith %

这是 to_string 过滤器:

@register.filter(name='to_string')
def to_string(value):
    return str(value)

然后使用该参数的 page_not_over_amount 过滤器:

@register.filter(name='page_not_over_amount')
def page_not_over_amount(page_nr, args):
    if args is None:
        return False
    else:
        arg_list = [arg.strip() for arg in args.split(',')]
        comment_amount = arg_list[0]
        comment_limit = arg_list[1]
        if page_nr*comment_limit < comment_amount-comment_limit:
            return True
        else:
            return False

但我得到了这个例外:

Could not parse some characters: amount_comments|to_string|+","+limit_amount_comments||to_string

提前致谢!

【问题讨论】:

【参考方案1】:

我认为更好的方法是编写自定义标签。尽管如此,您可以使用 add 过滤器 来创建一个可以使用with 标签引用为args 的字符串值。

% with amount_comments|to_string|add:','|add:limit_amount_comments|to_string as args %
 ...
% endwith %

奖励:

清理page_not_over_amount

@register.filter(name='page_not_over_amount')
def page_not_over_amount(page_nr, args):
    if args is None: 
       return False

    arg_list = list(map(int, args.split(',')))
    comment_amount, comment_limit = arg_list
    return page_nr * comment_limit < comment_amount - comment_limit

使用自定义分配标签

将标识函数assign_tuple 定义为simple custom assignment tag。 此函数带有传递给它的返回参数。你可以走得更远。

@register.assignment_tag
def assign_tuple(*args):
    return args

@register.filter(name='page_not_over_amount')
def page_not_over_amount(page_nr, args):
    if args is not None:
        comment_amount, comment_limit = args
        if page_nr * comment_limit < comment_amount - comment_limit:
            return True
    return False

在你的模板中使用这个标签,像这样:

% assign_tuple 2 3  as rarg %
 1|page_not_over_amount:rarg 

【讨论】:

你能告诉我如何在if标签中使用标签吗? 我不确定是否可以使用内置模板标签将标签与 if 标签一起使用。但是,在 if 标记中嵌套其他标记是可以实现的。 所以只写 % if custom_tag 'somevalues' %%endif%? 哦。我只是想明白你在问什么。我稍后会用如何制作自定义标签来更新我的答案。

以上是关于Django - 具有多个参数的过滤器的主要内容,如果未能解决你的问题,请参考以下文章

带有多个参数的 Django 模板标签过滤器

如何将三个或多个参数传递给自定义模板标签过滤器 django?

使用 django_filters 过滤多个参数

Django:过滤多个参数

Django将多个参数传递给If语句中的自定义模板过滤器

Django-查询过滤器,具有外来关系