小编典典

Django模板:Threes中的分组项目

css

我对Django有一个奇怪的问题。我会像平时一样在模板中循环遍历一组对象。但是,我需要将项目分为三部分。页面的布局如下所示:

绘画1-绘画2-绘画3

描述1
描述2
描述3

绘画4-绘画-5绘画6

说明4
说明5
说明6

我不能弄清楚真正做到这一点的最好的Django标签集。似乎有些棘手。{%cycle%}语句并没有太大帮助。

除非当然,否则我会进行某种形式的Java脚本黑客攻击,而将Django排除在外吗?必须有某种方式说“将所有描述div依次放置”或类似内容。不确定如何最好地使用此顺序。有什么想法吗?干杯。


阅读 326

收藏
2020-05-16

共1个答案

小编典典

只要您发现自己在模板中尝试复杂的代码,通常就可以很好地表明应将其移至其他位置。已经提出了一种替代解决方案,即将代码移到您的视图函数中。

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

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)

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

{% 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 %}
2020-05-16