首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django模板: Threes中的分组项目

Django模板: Threes中的分组项目
EN

Stack Overflow用户
提问于 2009-05-10 12:15:29
回答 6查看 4.8K关注 0票数 5

我对Django有个奇怪的问题。我有一组对象,我像往常一样在模板中遍历这些对象。但是,我需要将这些项目分成三组。页面的布局是这样的:

绘画1-绘画2-绘画3

D E S C R I P T I O N 1

D E S C R I P T I O N 2

D E S C R I P T I O N 3

绘画4-绘画-5绘画6

D E S C R I P T I O N 4

D E S C R I P T I O N 5

D E S C R I P T I O N 6

等等等等

我真的找不出最好的一组Django标签来做这件事。这看起来有点棘手。{% cycle %}语句没有多大帮助。

当然,除非我做了一些java脚本的黑客操作,并将Django排除在这之外?一定有某种方式可以说“把所有的描述div放在一起”或类似的说法。不确定如何更好地处理此顺序。有什么想法吗?干杯。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-10 17:03:51

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

另一种解决方案是通过新的模板标记公开功能。您选择此解决方案而不是视图解决方案的原因之一是,您将能够轻松地对具有不同视图的页面重用代码。

代码语言:javascript
运行
复制
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)

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

代码语言:javascript
运行
复制
{% 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 %}
票数 6
EN

Stack Overflow用户

发布于 2011-09-11 03:42:16

您可以使用一个简单的过滤器来执行此操作:

代码语言:javascript
运行
复制
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

然后在你的模板中:

代码语言:javascript
运行
复制
{% for chunk in paintings|chunks:3 %}
  <div class="row">
    {% for painting in chunk %}
      <div>{{ painting }}</div>
    {% endfor %}
  </div>
{% endfor %}
票数 11
EN

Stack Overflow用户

发布于 2009-05-10 12:27:32

下面这几行内容如何:

代码语言:javascript
运行
复制
{% for p in paintingss %}
    <div class="painting">whatever</div>
    {% if forloop.counter|divisibleby:"3" %}
        <br>
    {% endif %}
{% endfor %}

这对你有好处吗?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/845227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档