解压缩列表以在django中循环标记

Sen*_*abu 5 python django django-templates

我知道,我可以做点什么

{% cycle "value1" "value2" %}
Run Code Online (Sandbox Code Playgroud)

但是,如果我在列表中包含所有输入值,该怎么办?我能做点什么吗?

{% cycle my_input_list %}
Run Code Online (Sandbox Code Playgroud)

小智 5

django内置的cycle标签不支持传入变量。不过,您可以制作自己的自定义标签。像这样的东西应该有效:

import itertools
from django import template
register = template.Library()


class CycleNode(template.Node):
    def __init__(self, cyclevars):
        self.cyclevars = template.Variable(cyclevars)

    def render(self, context):
        names = self.cyclevars.resolve(context)
        if self not in context.render_context:
            context.render_context[self] = itertools.cycle(names)
        cycle_iter = context.render_context[self]
        return next(cycle_iter)


@register.tag
def cycle_list(parser, token):
    try:
        tag_name, arg = token.contents.split(None, 1)
    except ValueError:
        raise template.TemplateSyntaxError(
            "%r tag requires an argument" % token.contents.split()[0]
        )
    node = CycleNode(arg)
    return node
Run Code Online (Sandbox Code Playgroud)

然后在模板中:

{% cycle_list some_list %}
Run Code Online (Sandbox Code Playgroud)