9

我的上下文中有一个列表my_list ,我想将它呈现为两个“列”,第一列中的第一个 (n+1)/2 项和第二列中的最后 n/2 项。是否有一种直接的方法可以使用 django 模板标签/过滤器来执行此操作,或者我是否需要在我的视图中将列表预先拆分为两个?

例如,

<div class="split-50-left">
  <ul> 
    {% for item in [first half of my_list] %}
      <li>{{item}}</li>
    {% endfor %}
  </ul>
</div>
<div class="split-50-right">
  <ul> 
    {% for item in [second half of my_list] %}
      <li>{{item}}</li>
    {% endfor %}
  </ul>
</div>
4

4 回答 4

13

更“Django”的方式是在视图中进行,因为您应该尽可能多地保留模板之外的逻辑。话虽如此,有一种方法可以通过模板来完成。

如果您已经知道列表中有多少个,则可以使用切片模板标签。让我们假设你没有。

另一种方法是循环两次,只显示你想要的一半。不过,您每次都会浏览整个列表,因此可能会很昂贵它使用forloop 计数器

{% for item in items %}
#half list is calculated in your view. It is the items query /2
   {% if forloop.counter < half_list %}
       {% item.name %}
   {% endif %}
{% endfor %}

{% for item in items %}
#half list is calculated in your view. It is the items query /2
    {% if forloop.counter >= half_list %}
        {% item.name %}
    {% endif %}
{% endfor %}
于 2013-07-30T15:50:13.803 回答
1

完全在模板中执行此操作的一种(有点笨拙)的方法是使用widthratio模板标签来计算列表的中心,并使用模板标签来创建临时变量。

{% widthratio form.visible_fields|length 2 1 as visible_fields_centre %}
<div class="rows_form">
    {% with ":"|add:visible_fields_centre as first_slice %}
        {% for field in form.visible_fields|slice:first_slice %}
            {{ field }}
        {% endfor %}
    {% endwith %}
</div>
<div class="rows_form">
    {% with visible_fields_centre|add:":" as second_slice %}
        {% for field in form.visible_fields|slice:second_slice %}
            {{ field }}
        {% endfor %}
    {% endwith %}
</div>
于 2017-01-13T16:37:06.877 回答
1

如果您可以对两半进行插值 - 或者如果拆分中间并不重要 - 您可以分别渲染替代值。这会更便宜:

<ul><!-- Half of the list -->
    {% for i in values %}
        {% cycle 'odd' 'even' as state silent %}
        {% if state == 'odd' %}
            <li>{{ i }}</li>
        {% endif %}
    {% endfor %}
</ul>

<ul><!-- The other half -->
    {% for i in values %}
        {% cycle 'odd' 'even' as state silent %}
        {% if state == 'even' %}
            <li>{{ i }}</li>
        {% endif %}
    {% endfor %}
</ul>
于 2018-03-12T16:53:30.797 回答
1

使用 css 是否有意义?我相信它会在除 IE9 之外的任何地方工作。

<ul class="two-columns">
{% for item in object_list %}
  <li>{{ item }}</li>
{% endfor %}
</ul>

然后是CSS:

ul.two-columns {
    -moz-column-count: 2;
    -webkit-column-count: 2;
    column-count: 2;
}
于 2020-05-12T13:14:05.773 回答