让我试着通过一个小例子应用来解释我想要实现的目标。这是一个购物清单应用程序,可让您将预定义Items
添加到ShoppingList
Groceries
。聪明的是每个Item
都与Store
相关。
当我在我的购物清单中添加杂货时,我应该可以看到我的购物清单,其商店的杂货被组织(分组)。类似的东西:
如何创建视图和模板以分组和显示此购物清单?
例如:这就是我展示所有商店的完整库存的方式:
#views.py
store_list = Store.objects.all()
#template.html
{% for store in store_list %}
<div>{{store}}
<ul>
{% for item in store.item_set.all %}
<li>{{item}}</li>
{% endfor %}
</ul>
</div>
{% endfor %}
这对我的购物清单不起作用,但我真的在寻找同样强大/优雅的东西....
答案 0 :(得分:3)
内置regroup
模板标记怎么样?
{% regroup item.objects.all by store as store_groups %}
<ul>
{% for store_group in store_groups %}
<li>{{ store_group.grouper }}
<ul>
{% for item in store_group.list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
答案 1 :(得分:2)
在视图的后端而不是模板中进行分组。
在您的视图中,创建一个这样的字典:
sorted_groceries = {
store1 : [item1, item2],
store2 : [item3, item4],
}
可以使用类似于此伪代码的某些代码来完成:
sorted_groceries = {}
for item in shopping cart:
try:
sorted_groceries[item.store].append(item)
except KeyError:
sorted_groceries[item.store] = [item]
然后将其添加到您的上下文中,并让您的模板如下所示:
{% for store, items in sorted_groceries.items %}
<div>{{store}}
<ul>
{% for item in items %}
<li>{{item}}</li>
{% endfor %}
</ul>
</div>
{% endfor %}
答案 2 :(得分:1)
如何使用ifchanged https://docs.djangoproject.com/en/1.7/ref/templates/builtins/#ifchanged
假设shopping_list按商店排序:
{% for item in shopping_list %}
{% ifchanged %}<h3>{{ item.store.name }}</h3>{% endifchanged %}
{{ item.name }}
{% endfor %}