Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用django模板标记拆分列表_Django_Django Templates - Fatal编程技术网

使用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;
}