Django模板:在Threes中分组项目

Oni*_*Oni 5 css django templates

我对Django有一个奇怪的问题.我有一组像往常一样在模板中循环的对象.但是,我需要将这些项目分组.页面的布局如下:

绘画1 - 绘画2 - 绘画3

描述1
描述2
描述3

绘画4 - 绘画 - 5绘画6

描述4
描述5
描述6

等等

我真的无法弄清楚最好的Django标签集.这似乎有点棘手.{%cycle%}语句没什么帮助.

当然,除非我做一些某种类型的Java脚本黑客并让Django离开这个?必须有人说"把所有的描述divs放在一起"或类似的东西.不确定如何最好地使用此订购.有什么想法吗?干杯.

小智 7

你可以使用一个简单的过滤器:

import itertools

from django import template

register = template.Library()

@register.filter
def chunks(value, chunk_length):
    """
    Breaks a list up into a list of lists of size <chunk_length>
    """
    clen = int(chunk_length)
    i = iter(value)
    while True:
        chunk = list(itertools.islice(i, clen))
        if chunk:
            yield chunk
        else:
            break
Run Code Online (Sandbox Code Playgroud)

然后在你的模板里面:

{% for chunk in paintings|chunks:3 %}
  <div class="row">
    {% for painting in chunk %}
      <div>{{ painting }}</div>
    {% endfor %}
  </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)


Yuv*_*dam 5

关于这些方面的内容如何:

{% for p in paintingss %}
    <div class="painting">whatever</div>
    {% if forloop.counter|divisibleby:"3" %}
        <br>
    {% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

这对你有好处吗?


小智 5

每当你发现自己在模板中尝试复杂的代码时,它通常是一个很好的迹象,它应该被移动到其他地方.已经提出了一种替代解决方案,即将代码移动到视图函数中.

另一种解决方案是通过新模板标签公开功能.您在视图解决方案中选择此解决方案的原因之一是,您将能够轻松地重用使用不同视图的页面的代码.

class GroupPaintingsNode(template.Node):
    def __init__(self, num, varname):
        self.num, self.varname = int(num), varname

    def render(self, context):
        paintings = Painting.objects.all # do your fetching/filtering here.. 
        l = [[] for i in range(len(paintings))]
        i = 0
        while i < len(paintings):
            l[i].append([p.title for p in paintings[i:i+self.num]])
            l[i].append([p.desc for p in paintings[i:i+self.num]])
            i += self.num
        context[self.varname] = l
        return ''

def group_paintings(parser, token):
    tokens = token.contents.split()
    if len(tokens) != 4:
        raise template.TemplateSyntaxError, "'%s' tag requires three arguments" % tokens[0]
    if tokens[2] != 'as':
        raise template.TemplateSyntaxError, "Second argument to '%s' tag must be 'as'" % tokens[0]
    return GroupPaintingsNode(tokens[1], tokens[3])
group_paintings = register.tag(group_paintings)
Run Code Online (Sandbox Code Playgroud)

在模板代码中,您可以像这样使用它:

{% group_paintings 3 as paintings %}
{% for p in paintings %}
    {% for title in p.0 %} {{ title }} {% endfor %}<br>
    {% for desc in p.1 %} {{ desc }} {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)