Django 模板 %for% 标签每 4 个元素添加 li

Posted

技术标签:

【中文标题】Django 模板 %for% 标签每 4 个元素添加 li【英文标题】:Django template %for% tag add li every 4th elementDjango 模板 %for% 标签每 4 个元素添加 li 【发布时间】:2012-08-11 11:49:25 【问题描述】:

我需要在模板中表示集合并将每四个元素包装在

<li></li>

模板应该是这样的:

<ul>
    <li>
         <a></a>
         <a></a>
         <a></a>
         <a></a>
    </li>
    <li>
         <a></a>
         <a></a>
         <a></a>
         <a></a>
    </li>
    <li>
         <a></a>
         <a></a>
         <a></a>
         <a></a>
    </li>
</ul>

所以我需要在 % for % 中这样做

% for obj in objects %
 #add at 1th and every 4th element li wrap somehow#
    <a>object</a>
 # the same closing tag li#
% endfor %

【问题讨论】:

【参考方案1】:

如果你想通过检查第一个 forloop 和最后一个 forloop 来工作,你可以使用这个:

<ul>
% for obj in objects %
% if forloop.first %
    <li>
% endif %
        <a>obj</a>
% if forloop.counter|divisibleby:4 and not forloop.first %
    </li>
    <li>
% endif %
% if forloop.last %
    </li>
% endif %
% endfor %
</ul>

【讨论】:

【参考方案2】:

您可以使用前面提到的 divisibleby 标签,但出于清除模板的目的,我通常更喜欢返回生成器的辅助函数:

def grouped(l, n):
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

示例简单视图:

from app.helpers import grouped

def foo(request):
    context['object_list'] = grouped(Bar.objects.all(), 4)
    return render_to_response('index.html', context)

示例模板:

% for group in object_list %
   <ul>
        % for object in group %
            <li> object </li>
        % endfor %
   </ul>
% endfor %

【讨论】:

太棒了!这是迄今为止最简单、最干净、最易读的解决方案。 +1 谢谢,这太棒了 @Hedde van der Heide 漂亮的解决方案!我建议也许用范围切换 xrange。【参考方案3】:

以下应该可以解决您的问题,使用内置模板标签:

<ul>
    <li>
    % for obj in objects %
        <a> obj </a>

    # if the the forloop counter is divisible by 4, close the <li> tag and open a new one #
    % if forloop.counter|divisibleby:4 %
    </li>
    <li>
    % endif %

    % endfor %
    </li>
</ul>

【讨论】:

我真的不喜欢这种在满足条件时注入结束标签的程序方式。请参阅回复***.com/a/11965885/636626 以获得更具可读性和可重用性的解决方案。 @NilsWerner:取决于解决方案是否适用于用例。如果 Hedde 的解决方案需要您修改大量现有代码和/或基础设施,那么与生成器对象相比,仍然采用处理平面列表的“更简单的路线”可能更可行。此外,列表按多少项分组的责任已转移给调用者。这是否是所需的方式取决于用例。话虽如此,我同意争取更清洁的模板和可重用的解决方案是可取的。【参考方案4】:

我个人会考虑在将视图中的元素传递给模板之前将它们分开,然后使用嵌套的 for 循环。除此之外,您实际上只有 Vaibhav Mishra 提到的过滤器或模板标签选项。

【讨论】:

如果这 4 个对象一开始实际上并不属于一起,那么您的方法会将逻辑更紧密地与视觉表示结合起来。设计师和程序员应该能够分开工作,这毕竟是 django 的目标之一。 框架,如 Django,旨在满足自己的需求,如果需要对 imo 对象进行分组,则在视图层中执行此操作非常好。当然,如果它使设计师的生活更轻松。例如。通常,排序也在模板层之外进行。 @Hedde 我部分同意。尽管您实际上无法将这些对象分组为固定的 4 组(例如,名称的普通列表)。设计者可能只是为了向用户提供更紧凑的数据表示。但是,如果数据必须始终分组在一起因为它们属于一起(例如,数组看起来像 [name0, surname0, address0, phone0, name1, .., nameN, ..])那么,这确实应该在视图层中完成。至少我是这样理解视图(程序员)和模板(设计师)的分离。【参考方案5】:

您可以使用 divisibleby 内置过滤器,here is link to django documentation

所以这样的事情会起作用

% if value|divisibleby 4 %
#your conditional code
% endif %

【讨论】:

以上是关于Django 模板 %for% 标签每 4 个元素添加 li的主要内容,如果未能解决你的问题,请参考以下文章

django模板标签运行循环不是所有对象[重复]

无法在 Django 模板文件的 for 循环中使用条件标签

django-4-模板标签,模板继承

Django、模板、for 循环和循环

Django中级篇之模板语言

Django web框架之模板