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)
关于这些方面的内容如何:
{% 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)