将相关项目组织成组的模式
Pattern to organize related items into groups
让我尝试通过一个小示例应用程序来解释我想要实现的目标。这是一个购物清单应用程序,可让您将预定义的 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 %}
这对我的购物清单不起作用,但我真的在寻找同样强大/优雅的东西....
在视图后端而不是模板中进行分组。
在你看来,创建一个这样的字典:
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 %}
如何使用 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 %}
内置的 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>
让我尝试通过一个小示例应用程序来解释我想要实现的目标。这是一个购物清单应用程序,可让您将预定义的 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 %}
这对我的购物清单不起作用,但我真的在寻找同样强大/优雅的东西....
在视图后端而不是模板中进行分组。
在你看来,创建一个这样的字典:
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 %}
如何使用 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 %}
内置的 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>