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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django模板中的备用行着色具有多个行集相关的知识,希望对你有一定的参考价值。

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 %}

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

Django ticket: Cycle tag should reset after it steps out of scope

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

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

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

答案

最简单的解决方法(直到重置补丁修复并应用)是使用带有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 %}

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

另一答案

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

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}
另一答案

您可以使用标记的cycleresetcycle(Django 1.11中的新功能)调用(来自https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-resetcycle):

{% for blog in blogs %}
  {% cycle 'odd' 'even' as rowcolors silent %}
  {% resetcycle rowcolors %}
  {% for entry in blog.entries %}
    {% cycle rowcolors %}
    <div class="{{ rowcolors }}" id="{{entry.id}}">
      {{ entry.text }}
    </div>
  {% endfor %}
{% endfor %}
另一答案

我最终这样做了,使用了forloop.counter0 - 效果很好!

{% for product in products %}

    {% if forloop.counter0|divisibleby:4 %}<div class="clear"></div>{% endif %}

    <div class="product {% if forloop.counter0|divisibleby:4 %}col{% else %}col20{% endif    %}">
        Lorem Ipsum is simply dummy text
    </div>

{% endfor %}
另一答案

最简单的答案可能是:“放弃并使用jQuery。”如果这是可以接受的,那么与使用Django的模板进行战斗相比,这可能更容易。

另一答案

放弃并使用Jinja2 Template System

我放弃了django模板语言,它对你可以用它做什么非常有限。 Jinja2使用与django模板相同的语法,但增加了许多增强功能。

编辑/注意(我知道这对于一个小问题来说听起来像是一个很大的转变,但实际上我敢打赌你总是发现自己在django中与默认模板系统作斗争,所以这真的是值得的,我相信它会让你更有效率从长远来看。)

你可以阅读this article written by its author,虽然它是技术性的,但他提到了django中{%cycle%}标签的问题。

Jinja没有循环标记,循环上有循环方法:

{% for user in users %}
    <li class="{{ loop.cycle('odd', 'even') }}">{{ user }}</li>
{% endfor %}

Jinja2的一个主要优点是它允许你使用逻辑进行演示,所以如果你有一个图片列表,你可以将它们放在一个表中,因为你可以在每个N元素的表格中开始一个新行,参见,你可以这样做:

{% if loop.index is divisibleby(5) %}   
     </tr>
     {% if not loop.last %}
     <tr>
     {% endif %}
{% endif %}

你也可以使用数学表达式:

{% if x > 10 %}

并且您可以直接访问您的python函数(但需要一些设置来指定应该为模板公开哪些函数)

{% for item in normal_python_function_that_returns_a_query_or_a_list() %}

甚至设置变量..

{% set variable_name = function_that_returns_an_object_or_something() %} 
另一答案

有一种方法可以在服务器端使用迭代器来实现,该迭代器不会同时保留所有条目的副本:

import itertools
return render_to_response('template.html',
  {
    "flattened_entries": itertools.chain(*(blog.entries for blog in blogs)),
  })

以上是关于Django模板中的备用行着色具有多个行集的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段着色器中进行自定义模板测试

通过 ASP.NET Core Web API 使用存储过程从 SQL Server 返回多个行集

在GLSL ES中的片段着色器上旋转纹理

从多个表中检索多个列不存在或匹配行集(mysql php)

使用 django html 模板创建具有动态行和列的表

从片段着色器中的地形高程数据计算法线