在Django模板中动态创建列表

dav*_*ers 9 django django-templates

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

{% with var1 var2 var3 as some_list %}
    {{ some_list|maximum }}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

从任意数量的模板变量和/或文字中动态创建列表似乎很有用,所以我希望我忽略了一些简单的事情.

但是,如果不这样做,我想知道如何创建一个接受任意数量参数的模板标签.(我玩过simple_tag,适用于接受固定数量参数的标签.)

我不想去创建解析器和子类化的麻烦,django.template.Node直到我确定没有更简单的解决方案.

Wil*_*rdy 15

如果要添加新变量(即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 ""
Run Code Online (Sandbox Code Playgroud)

并像这样使用它来创建一个新变量some_list:

{% make_list var1 var2 var3 as some_list %}
Run Code Online (Sandbox Code Playgroud)

随意给它一个更好的名字!

  • +1.此解决方案允许您将结果列表保存在另一个变量中,以便稍后对其进行操作. (2认同)