将一个查询集渲染为2个div列(django模板)

T. *_*one 15 django django-templates 960.gs

有没有一种方法将查询集的枚举呈现为两div列?

使用960网格,我有一些效果......

<div class="container_16">
    <div class="grid_8 alpha"></div>
    <div class="grid_8 omega"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

在Django中,一个模型需要在两个列中呈现它的枚举内容,并且最好在某种程度上相同.目前,我有一些丑陋的代码,在视图中将QuerySet分成两半,然后每一半都在各自的列中呈现.

必须有更好的方法来做到这一点,最好只使用模板渲染系统?

仅供参考,目前它的"工作原理"如下:

views.py

@render_to('template.html')
def main_athletics_page(request, *args, **kwargs):    
    sports = Sport.objects.all()
    half = sports.count() / 2
    return { 'sports_1' : sports[0:half], 'sports_2' : sports[half:] }
Run Code Online (Sandbox Code Playgroud)

template.html

<div class="grid_8 alpha">
    {% for sport in sports_1 %}
        <!-- Blah blah -->
    {% endfor %}
</div>

<div class="grid_8 omega">
    {% for sport in sports_2 %}
        <!-- Blah blah -->
    {% endfor %}
</div>
Run Code Online (Sandbox Code Playgroud)

not*_*oop 15

我建议使用Django过滤器.

Django代码段提供了一个分区模板过滤器,您可以使用它:

{% load listutil %}

<div class="grid_8 alpha">
    {% for sport in sports|partition:"2"|first %}
        <!-- Blah Blah -->
    {% endfor %}
</div>

<div class="grid_8 omega">
    {% for sport in sports|partition:"2"|last %}
        <!-- Blah Blah -->
    {% endfor %}
</div>
Run Code Online (Sandbox Code Playgroud)

  • 这里还有一个改进的版本:http://djangosnippets.org/snippets/401/ (7认同)

MrK*_*Ksn 6

  1. 这是渲染系统的任务,而不是视图.视图不应该知道您是否在模板中显示2,3或4列.
  2. 使用默认的Django标签总是更好.

使用默认的Django模板标签cycle:

<table>
    {% for item in items %}
        {% cycle 'row' '' as row silent %}
        {% if row %}<tr>{% endif %}
            <td>
                {{ item }}
            </td>
        {% if not row %}</tr>{% endif %}
    {% endfor %}
</table>
Run Code Online (Sandbox Code Playgroud)

它会将您的列表[1 2 3 4 5 6]显示为

1 2

3 4

5 6

顺便说一句,Jinja2模板引擎有batchslice过滤器可以做到这一点.我切换到jinja2,现在没有"如何使用糟糕的django标签和过滤器显示x"的问题