【问题标题】:How to pass the result of a tag to a filter in Django?如何将标签的结果传递给 Django 中的过滤器?
【发布时间】:2011-10-20 07:59:10
【问题描述】:

如何将标签的结果传递给 Django 中的过滤器?

例如

{{ {% widthratio a b c %}|add: 2 }}

【问题讨论】:

    标签: django django-templates django-template-filters


    【解决方案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 }}

        【讨论】:

          猜你喜欢
          • 2011-07-10
          • 1970-01-01
          • 2012-08-25
          • 2016-12-11
          • 2015-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-12
          相关资源
          最近更新 更多