Django - 过滤多个段

时间:2017-10-30 20:18:23

标签: python django filter

我正在尝试创建一个包含多个参数的过滤器。我发现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 filter:

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

然后使用该args进行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 个答案:

答案 0 :(得分:1)

我认为更好的方法是编写自定义标记。尽管如此,您仍可以使用添加过滤器创建单个字符串值,该值可以使用args标记引用为with

{% 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 }}