有没有一种方法可以将查询集的枚举呈现为两个div
列?
使用960网格,我有一些效果......
<div class="container_16">
<div class="grid_8 alpha"></div>
<div class="grid_8 omega"></div>
</div>
在Django中,一个模型需要在两个列中呈现它的枚举内容,并且最好在某种程度上相同。目前,我有一些丑陋的代码,在视图中将QuerySet分成两半,然后每一半都在各自的列中呈现。
必须有更好的方法,最好只使用模板渲染系统?
仅供参考,目前它的“工作原理”如下:
@render_to('template.html')
def main_athletics_page(request, *args, **kwargs):
sports = Sport.objects.all()
half = sports.count() / 2
return { 'sports_1' : sports[0:half], 'sports_2' : sports[half:] }
<div class="grid_8 alpha">
{% for sport in sports_1 %}
<!-- Blah blah -->
{% endfor %}
</div>
<div class="grid_8 omega">
{% for sport in sports_2 %}
<!-- Blah blah -->
{% endfor %}
</div>
答案 0 :(得分:16)
我建议使用Django filters。
Django代码段提供partitioning template filter,您可以使用它:
{% load listutil %}
<div class="grid_8 alpha">
{% for sport in sports|partition:"2"|first %}
<!-- Blah Blah -->
{% endfor %}
</div>
<div class="grid_8 omega">
{% for sport in sports|partition:"2"|last %}
<!-- Blah Blah -->
{% endfor %}
</div>
答案 1 :(得分:5)
使用默认的Django模板标记cycle
:
<table>
{% for item in items %}
{% cycle 'row' '' as row silent %}
{% if row %}<tr>{% endif %}
<td>
{{ item }}
</td>
{% if not row %}</tr>{% endif %}
{% endfor %}
</table>
它会将您的列表[1 2 3 4 5 6]显示为
1 2
3 4
5 6
顺便说一句,Jinja2模板引擎有batch
和slice
过滤器可以解决问题。我切换到jinja2,现在没有任何问题&#34;如何使用糟糕的django标签和过滤器显示x&#34;
答案 2 :(得分:0)
我认为您必须制作自己的模板标记才能对查询进行拆分。我会做类似的事情。
from django.template import Library, Node, TemplateSyntaxError
from restaurants.forms import MenuItemForm
class Split(Node):
def __init__(self, queryset, split_count=2, basename=None):
self.queryset_name = queryset
self.split_count = split_count
self.basename = basename if basename else queryset
def render(self, context):
qs = context[self.queryset_name]
qs_break = len(qs)/self.split_count
for x in xrange(0, self.split_count-1):
context["%s_%i"%(self.basename, x+1)] = qs[qs_break*x:qs_break*(x+1)]
context["%s_%i"%(self.basename, x+2)] = qs[qs_break*x+1:]
return ''
def split(parser, token):
"""
Call from template will be
{% split <queryset> on <count> as <name> %}
"""
tokens = token.split_contents()
if len(tokens) > 6:
raise TemplateSyntaxError("Too many Tokens")
#Do various tests to make sure it's right.
return Split(tokens[1], tokens[3], tokens[5])
split = register.tag(split)
请注意,我实际上没有测试过这段代码,所以它可能会失败,但是它应该指向正确的方向,让你的视图无法使用。
答案 3 :(得分:0)
这是一个使用bootstrap并且不需要Django过滤器的快速解决方案
<div class="row">
{% for sport in sports %}
<div class="col-md-6">
<!-- Blah Blah -->
</div>
{% endfor %}
</div>