使用django模板标记拆分列表
在我的上下文中,我有一个列表使用django模板标记拆分列表,django,django-templates,Django,Django Templates,在我的上下文中,我有一个列表my_list,我想将它呈现为两个“列”,第一列中有第一个(n+1)/2项,第二列中有最后一个n/2项。对于django模板标记/过滤器,是否有一种直接的方法可以做到这一点,或者我是否需要在视图中将列表预先拆分为两个 e、 g {%[我的_列表的前半部分]]中的项目为% {{item}} {%endfor%} {%[我的_列表的后半部分]]中的项目为% {{item}} {%endfor%} 更多的“Django”方法是在视图中执行,因为您应该尽可能多地保留
my_list
,我想将它呈现为两个“列”,第一列中有第一个(n+1)/2项,第二列中有最后一个n/2项。对于django模板标记/过滤器,是否有一种直接的方法可以做到这一点,或者我是否需要在视图中将列表预先拆分为两个
e、 g
{%[我的_列表的前半部分]]中的项目为%
- {{item}}
{%endfor%}
{%[我的_列表的后半部分]]中的项目为%
- {{item}}
{%endfor%}
更多的“Django”方法是在视图中执行,因为您应该尽可能多地保留模板中的逻辑。也就是说,有一种方法可以通过模板实现
如果您已经知道列表中有多少,则可以使用。让我们假设你没有
另一种方法是在它上面循环两次,只显示你想要的一半。但是每次你都会浏览整个列表,所以可能会很昂贵。它使用
{items%]中的项的%
#半列表是在您的视图中计算的。这是项目查询/2
{%if-forloop.counter=half_list%}
{%item.name%}
{%endif%}
{%endfor%}
完全在模板中实现这一点的一种方法是使用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>
{%widthratio form.visible_fields |长度2 1作为visible_fields_center%}
{%with:“|添加:可见_字段_中心作为第一个_切片%}
{%表示表单中的字段。可见_字段|切片:第一个_切片%}
{{field}}
{%endfor%}
{%endwith%}
{带可见_字段的%|添加::“作为第二个_切片%}
{%表示表单中的字段。可见_字段|切片:第二个_切片%}
{{field}}
{%endfor%}
{%endwith%}
如果可以对两半进行插值,或者如果拆分中间部分并不重要,则可以分别渲染备用值。这会更便宜:
<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>
{值%%中的i为%1}
{%循环“奇数”“偶数”作为状态静默%}
{%if state=='奇数'%}
- {{i}
{%endif%}
{%endfor%}
{值%%中的i为%1}
{%循环“奇数”“偶数”作为状态静默%}
{%if state=='偶数'%}
- {{i}
{%endif%}
{%endfor%}
使用css有意义吗?我相信它会奏效
分成均匀的块。用法
{%split_list my_list as chunked_data 2%}
我想说一些类似的话(在视图中,这是更Django的方式),但另一方面,这不是真正的显示逻辑吗?Django说应该在模板中完成。这一点很好。无论模板是否显示,我总是尽量避免使用太多的逻辑。你被赋予了更多的权力,模板是如此的有限。完全是这样,在视图中做起来会容易得多。真的很糟糕,模板语言的局限性太大了。有时显示逻辑确实需要实际的逻辑。正如您所提到的,它看起来确实像“显示”逻辑,但考虑到模板语言的局限性,我在视图中拆分列表,并将其作为“左项”和“右项”放在上下文中,因为我至少必须计算“半项列表”或者在我看来是类似的。谢谢left_items=items[:(len(items)+1)/2]
right_items=items[(len(items)+1)/2:
根据标记的外观,您不必调用forloop两次,只需执行{%if-forloop.counter==half_list%}
然后关闭第一个列表并打开其中的第二个列表。
{% 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>
<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>
<ul class="two-columns">
{% for item in object_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
ul.two-columns {
-moz-column-count: 2;
-webkit-column-count: 2;
column-count: 2;
}