代码之家  ›  专栏  ›  技术社区  ›  davidchambers

在Django模板中动态创建列表

  •  9
  • davidchambers  · 技术社区  · 14 年前

    我不知道这是否可能,但我希望能够写出如下内容:

    {% with var1 var2 var3 as some_list %}
        {{ some_list|maximum }}
    {% endwith %}
    

    如果做不到这一点,我想知道如何创建一个接受任意数量参数的模板标记。(我和你玩过 simple_tag ,这对于接受固定数量参数的标记非常有效。)

    我不想麻烦地创建解析器和子类 django.template.Node

    2 回复  |  直到 14 年前
        1
  •  18
  •   Will Hardy    14 年前

    如果要添加新变量(即 some_list simple_tag 还不够。

    对我来说,第一种方法是尝试在视图中执行这类工作,以便使模板尽可能简单。

    如果不合适,则必须手动写入标记,如下所示:

    @register.tag
    def make_list(parser, token):
      bits = list(token.split_contents())
      if len(bits) >= 4 and bits[-2] == "as":
        varname = bits[-1]
        items = bits[1:-2]
        return MakeListNode(items, varname)
      else:
        raise template.TemplateSyntaxError("%r expected format is 'item [item ...] as varname'" % bits[0])
    
    class MakeListNode(template.Node):
      def __init__(self, items, varname):
        self.items = map(template.Variable, items)
        self.varname = varname
    
      def render(self, context):
        context[self.varname] = [ i.resolve(context) for i in self.items ]
        return ""
    

    一些清单

    {% make_list var1 var2 var3 as some_list %}
    

    请随便给它起个更好的名字!

        2
  •  3
  •   Community uzul    7 年前

    我玩了一会儿,想出了一个标签,可以接受可变数量的参数,并将它们转换成一个列表。

    @register.tag('to_list')
    def to_list(_parser, token):
        try:
            parts = token.split_contents()
        except ValueError:
            raise template.TemplateSyntaxError, \
              "%r tag requires at least one argument" % token.contents.split()[0]
    
        return AsListNode(parts[1:])
    
    class AsListNode(template.Node):
        def __init__(self, parts):
            self.parts = map(lambda p: template.Variable(p), parts)
    
        def render(self, context):
            resolved = []
            for each in self.parts:
                resolved.append(each.resolve(context))
            return resolved
    

    模板:

    <p>{% to_list var1 var2 var3 %}</p>
    

    更新

    @威尔的 solution