【问题标题】:Unpack a list to cycle tag in django在 django 中解压列表以循环标记
【发布时间】:2015-04-08 22:13:08
【问题描述】:

我知道,我可以做类似的事情

{% cycle "value1" "value2" %}

但是,如果我将所有输入值都放在一个列表中怎么办。我可以这样做吗?

{% cycle my_input_list %}

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    django 内置的循环标签不支持传入变量。 不过,您可以制作自己的自定义标签。 这样的事情应该可以工作:

    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
    

    然后在模板中:

    {% cycle_list some_list %}
    

    【讨论】:

    • 嗯。所以我必须为任何这样的标签重写代码。我这里只是以循环标签为例。我有一堆其他类似的第三方标签,我想为所有这些标签解包。用新名称重写每个标签似乎是糟糕的设计。我很惊讶 django 的设计者从来没有考虑过这样一个基本的用例。
    • 不是每个标签都这样,我特别指的是循环标签。根据具体情况接受。内置的 django 标签涵盖了最常见的场景,其余的由你决定。
    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多