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

时间:2015-02-24 16:37:22

标签: python django models

让我试着通过一个小例子应用来解释我想要实现的目标。这是一个购物清单应用程序,可让您将预定义Items添加到ShoppingList Groceries。聪明的是每个Item都与Store相关。

model

当我在我的购物清单中添加杂货时,我应该可以看到我的购物清单,其商店的杂货被组织(分组)。类似的东西:

template

如何创建视图和模板以分组和显示此购物清单?

例如:这就是我展示所有商店的完整库存的方式:

#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 %}

这对我的购物清单不起作用,但我真的在寻找同样强大/优雅的东西....

3 个答案:

答案 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 %}