将相关项目组织成组的模式

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>