如何将标签的结果传递给 Django 中的过滤器?
Posted
技术标签:
【中文标题】如何将标签的结果传递给 Django 中的过滤器?【英文标题】:How to pass the result of a tag to a filter in Django? 【发布时间】:2011-10-20 07:59:10 【问题描述】:例如
% widthratio a b c %|add: 2
【问题讨论】:
【参考方案1】:你不能,除非标签知道如何修改上下文(那些通常有xxx as variable
语法可用)。如果没有,您可以编写一个包装器(作为自定义标签)。
【讨论】:
你现在可以了,因为 django 不久前在模板语言中添加了“as”赋值运算符(1.9 版?)。请参阅下面的答案。【参考方案2】:这样做的正确方法是编写自己的标签:
% widthratio_add a b c d %
你写的标签和widthratio做同样的逻辑,然后加上数字。
不过,我怀疑您只是想这样做,因为 django 不允许模板中的基本数学超出“添加”,而当您编写自己的标签时,您可以用更少的代码做一些更直接的事情论据:
% mymathtag a d %
查看此内容以获得有关如何执行此操作的一般说明:Do math using Django template filter?
【讨论】:
【参考方案3】:这是我的自定义模板标签解决方案:
from django import template
from django.template.defaulttags import WidthRatioNode
register = template.Library()
class WidthRationExtraNode(WidthRatioNode):
def render(self, context):
extra = int(self.extra.resolve(context))
value = int(super(WidthRationExtraNode, self).render(context))
return str(value+extra)
def __init__(self, val_expr, max_expr, max_width, extra):
self.extra = extra
super(WidthRationExtraNode, self).__init__(val_expr, max_expr, max_width)
def widthratioextra(parser, token):
bits = token.contents.split()
if len(bits) != 5:
raise TemplateSyntaxError("widthratio takes four arguments")
tag, this_value_expr, max_value_expr, max_width, extra = bits
return WidthRationExtraNode(parser.compile_filter(this_value_expr),
parser.compile_filter(max_value_expr),
parser.compile_filter(max_width),
parser.compile_filter(extra))
widthratioextra = register.tag(widthratioextra)
您可以在模板中使用它:
% widthratioextra a b c d %
给你的应用添加自定义模板标签比较容易,如果你不知道怎么做,这里是手册的相关部分:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/
【讨论】:
【参考方案4】:只需使用“as”关键字:
% widthratio a b c 作为结果 % 结果 |添加:2
【讨论】:
以上是关于如何将标签的结果传递给 Django 中的过滤器?的主要内容,如果未能解决你的问题,请参考以下文章
如何将javascript变量传递给django自定义过滤器