2015-02-24 37 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