2015-02-24 39 views
4

让我试着通过一个小例子应用程序来解释我想实现的目标。这是一个购物清单应用程序,可让您将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 %} 

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

回答

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 %} 
+0

首先你的“伪代码”击败了我的实际Python代码。这是多么令人沮丧? ;)除此之外,感谢您的优雅代码。我担心在Django模型API中会有处理这个问题的方法,我忽略了它。我猜不是,这是有效的。 – 2015-02-24 18:48:42

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 %} 
+0

这将适用于这个例子,不太确定我可以调整它以涵盖我将遇到的用例。根据@GraphicsNoob的答案在视图中分组可能会增加一些灵活性。尽管如此,仍然有用。 – 2015-02-24 18:43:31

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> 
+0

这是意想不到的。我在Django上大概两年没有做任何事情,我会发誓当时没有这些好东西可用。坚定的建议,这个问题通过答案变得越来越好。 – 2015-02-24 21:12:50