我正在尝试创建一个包含多个参数的过滤器。我发现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
提前致谢!
答案 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 }}