Django模板中的备用行着色具有多个行集

Car*_*l G 58 django django-templates

Django模板提供内置标记,cycle用于在模板中的不同点(或模板中的循环)之间交替切换多个值,但是当在cycles定义之外的范围内访问此标记时,此标记不会重置.也就是说,如果你在你的模板两个或多个列表,所有的行,你想它的使用一些CSS定义oddeven,列表的第一行会拿起其中最后一个离开,而不是用新的迭代来自选择(oddeven)

例如,在下面的代码中,如果第一个博客的条目数量为奇数,那么第二个博客中的第一个条目将even在我希望它开始时开始odd.

{% for blog in blogs %}
  {% for entry in blog.entries %}
    <div class="{% cycle 'odd' 'even' %}" id="{{entry.id}}">
      {{entry.text}}
    </div>
  {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我尝试通过修补resetcycle此处提供的标记来避免这种情况:

Django票证:周期标记应在超出范围后重置

无济于事.(该代码对我不起作用.)

我也尝试将我的内部循环移动到自定义标记中,但这也不起作用,可能是因为编译/渲染循环将循环移回外部循环?(不管为什么,它对我不起作用.)

我怎样才能完成这个简单的任务!?我不希望在我的视图中使用预先编译的信息创建数据结构; 这似乎没必要.提前致谢.

Car*_*yer 111

最简单的解决方法(直到重置补丁修复并应用)是使用带有forloop.counter的内置"divisibleby"过滤器:

{% for entry in blog.entries %}
  <div class="{% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}" id="{{ entry.id }}">
    {{ entry.text }}
  </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

更冗长,但不难理解,它很有效.

  • 人们也可以写得更短(至少在Django 1.3中):`{{forloop.counter | divisibleby:2 | yesno:"even,odd"}}` (26认同)

Mat*_*att 14

https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#cycle

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)