【问题标题】:How to cycle across 2 forloops within a django template如何在 django 模板中循环 2 个 for 循环
【发布时间】:2013-10-26 12:01:30
【问题描述】:

我有一个 django 模板,我需要在两个不同的 for 循环中循环一组背景颜色。循环标签似乎被设计为在一个 for 循环内或完全在一个 for 循环外使用。这是我的代码:

{% if global_adverts %}
        <span style="display:none">{% cycle 'advert-grey' 'advert-pale-blue' 'advert-green' 'advert-blue' as adcolors %}</span>
        {% for advert in global_adverts %}
            <div class="{% cycle adcolors %}">
                {% if advert.url %}<a href="{{ advert.url }}">{% endif %}
                    <p>{{ advert.text }}</p>
                {% if advert.url %}</a>{% endif %}
            </div>
        {% endfor %}
    {% endif %}
    {% with self.adverts.all as adverts %}
        {% if adverts %}
            {% for advert in adverts %}
                <div class="{% cycle adcolors %}">
                    {% if advert.url %}<a href="{{ advert.url }}">{% endif %}
                        <p>{{ advert.text }}</p>
                    {% if advert.url %}</a>{% endif %}
                </div>
            {% endfor %}
        {% endif %}
    {% endwith %}

有没有办法做到这一点,而无需在第一个循环之前输出循环中的第一项并且不必用 css 隐藏它?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    我觉得在循环之外有第一个 {% cycle %} 声明更干净,我不希望 条件 循环内的声明可以工作,下面是如何使它工作:

    {% cycle 'advert-grey' 'advert-pale-blue' 'advert-green' 'advert-blue' as adcolour silent %}
    
    {% if global_adverts %}
        {% for advert in global_adverts %}
            <div class="{{ adcolours }}">
                {% if advert.url %}<a href="{{ advert.url }}">{% endif %}
                    <p>{{ advert.text }}</p>
                {% if advert.url %}</a>{% endif %}
            </div>
            {% cycle adcolours %}
        {% endfor %}
    {% endif %}
    {% with self.adverts.all as adverts %}
        {% if adverts %}
            {% for advert in adverts %}
                <div class="{{ adcolours }}">
                    {% if advert.url %}<a href="{{ advert.url }}">{% endif %}
                        <p>{{ advert.text }}</p>
                    {% if advert.url %}</a>{% endif %}
                </div>
                {% cycle adcolour %}
            {% endfor %}
        {% endif %}
    {% endwith %}
    

    由于{% cycle adcolour %} 是静音的,我们使用{{ adcolour }} 来打印当前颜色。我们仍然需要使用静默 {% cycle adcolour %} 来逐步遍历每次迭代的颜色。

    【讨论】:

      【解决方案2】:

      我发现以下代码给出了预期的结果:

      {% if global_adverts %}
              {% for advert in global_adverts %}
                  <div class="{% cycle 'advert-grey' 'advert-pale-blue' 'advert-green' 'advert-blue' as adcolours %}">
                      {% if advert.url %}<a href="{{ advert.url }}">{% endif %}
                          <p>{{ advert.text }}</p>
                      {% if advert.url %}</a>{% endif %}
                  </div>
              {% endfor %}
          {% endif %}
          {% with self.adverts.all as adverts %}
              {% if adverts %}
                  {% for advert in adverts %}
                      <div class="{% cycle adcolours %}">
                          {% if advert.url %}<a href="{{ advert.url }}">{% endif %}
                              <p>{{ advert.text }}</p>
                          {% if advert.url %}</a>{% endif %}
                      </div>
                  {% endfor %}
              {% endif %}
          {% endwith %}
      

      【讨论】:

        【解决方案3】:

        只需添加静音

        {% cycle 'advert-grey' 'advert-pale-blue' 'advert-green' 'advert-blue' as adcolors silent %}
        

        它阻止标签输出值

        评论后编辑

        如果您需要为每个循环继续循环,只需使用两次循环并在第二个循环中更改项目的顺序:

        {% if global_adverts %}
                {% for advert in global_adverts %}
                    <div class="{% cycle 'advert-grey' 'advert-pale-blue' 'advert-green' 'advert-blue' %}">
                        {% if advert.url %}<a href="{{ advert.url }}">{% endif %}
                            <p>{{ advert.text }}</p>
                        {% if advert.url %}</a>{% endif %}
                    </div>
                {% endfor %}
            {% endif %}
            {% with self.adverts.all as adverts %}
                {% if adverts %}
                    {% for advert in adverts %}
                        <div class="{% cycle 'advert-pale-blue' 'advert-green' 'advert-blue' 'advert-grey' %}">
                            {% if advert.url %}<a href="{{ advert.url }}">{% endif %}
                                <p>{{ advert.text }}</p>
                            {% if advert.url %}</a>{% endif %}
                        </div>
                    {% endfor %}
                {% endif %}
            {% endwith %}
        

        【讨论】:

        • 这似乎在我调用它的每一点都抑制了输出,而不仅仅是第一次。
        • 是的,现在我看到了你对循环的确切用途,这有点奇怪,我会检查解决方案
        • @Brighty 所以你只希望循环项目在每次循环迭代中都相同?
        • 我需要循环在两个 for 循环中继续。在理想情况下,我会在第一个循环之前设置一个计数器变量,然后在两个循环的每个循环中递增它。但显然我不能在 django 模板中做到这一点。
        • 谢谢 - 但这也不完全正确。上面代码的问题在于,它为第二个循环再次启动循环,而不是继续遍历背景颜色列表。
        猜你喜欢
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多