我对Django有一个奇怪的问题。我会像平时一样在模板中循环遍历一组对象。但是,我需要将项目分为三部分。页面的布局如下所示:
绘画1-绘画2-绘画3
描述1 描述2 描述3
绘画4-绘画-5绘画6
说明4 说明5 说明6
等
我不能弄清楚真正做到这一点的最好的Django标签集。似乎有些棘手。{%cycle%}语句并没有太大帮助。
除非当然,否则我会进行某种形式的Java脚本黑客攻击,而将Django排除在外吗?必须有某种方式说“将所有描述div依次放置”或类似内容。不确定如何最好地使用此顺序。有什么想法吗?干杯。
只要您发现自己在模板中尝试复杂的代码,通常就可以很好地表明应将其移至其他位置。已经提出了一种替代解决方案,即将代码移到您的视图函数中。
另一种解决方案是通过新的模板标签公开功能。选择此解决方案而不是视图解决方案的原因之一是,您将能够轻松地将代码重新用于具有不同视图的页面。
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 %}