我对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放在一起”或类似的说法。不确定如何更好地处理此顺序。有什么想法吗?干杯。
发布于 2009-05-10 17:03:51
每当你发现自己在模板中尝试复杂的代码时,这通常是一个很好的迹象,表明它应该被转移到其他地方。已经提出了一种替代解决方案,即将代码移动到视图函数中。
另一种解决方案是通过新的模板标记公开功能。您选择此解决方案而不是视图解决方案的原因之一是,您将能够轻松地对具有不同视图的页面重用代码。
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 %}
发布于 2011-09-11 03:42:16
您可以使用一个简单的过滤器来执行此操作:
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
然后在你的模板中:
{% for chunk in paintings|chunks:3 %}
<div class="row">
{% for painting in chunk %}
<div>{{ painting }}</div>
{% endfor %}
</div>
{% endfor %}
发布于 2009-05-10 12:27:32
下面这几行内容如何:
{% for p in paintingss %}
<div class="painting">whatever</div>
{% if forloop.counter|divisibleby:"3" %}
<br>
{% endif %}
{% endfor %}
这对你有好处吗?
https://stackoverflow.com/questions/845227
复制相似问题