2010-10-27 58 views
2

下面的描述大大簡化了 - 它只是我們正在處理的更大問題的一部分,但是可以安全地忽略內部問題。在Django模板中處理表示邏輯

假設我們有以下型號: -

class Item(models.Model): 
    name = models.CharField(max_length=150) 
    value = models.DecimalField(max_digits=12,decimal_places=2) 

class Person(models.Model): 
    name = models.CharField(max_length=150) 
    items = models.ManyToManyField(Item, through='AssignedItem') 

class AssignedItem(models.Model): 
    person = models.ForeignKey(Person) 
    item = models.ForeignKey(Item) 
    value = models.DecimalField(max_digits=12,decimal_places=2) 

所以基本上一個人可以被分配零個,一個或多個項目,每個已分配的項目的價值可以通過指定新值來覆蓋這個特定的人在through模型中。

我們希望達到的目標是具有所有Item.name爲標題行,與標題行中一個額外列Person.name HTML表。

每個Person可具有一組不同的分配給他們的Person.items因此預期,如果一個Person尚未分配的Item,對於Person相應小區將是空白的(請參閱附圖像) 。

alt text

的問題是如何將正確的AssignedItem值對應的列。我們有一個項目的查詢集,我們在模板中循環創建標題行,然後我們有包含每個人的項目的列表列表。但是我們如何確保在相應的Item頭下面顯示正確的AssignedItem?

回答

0

好了,主要問題是確保在相應的Item標題下顯示正確的AssignedItem

我在模板中嘗試了很多東西,但它沒有提供太多的操作空間。我最終在視圖中創建了「表」,然後將字符串傳遞給模板進行渲染。

0

你提到你在視圖中構建列表,

我們有我們 是循環遍歷模板 創建標題行項目的一個QuerySet,然後我們 有一個列表包含每個 個人物品的列表。

構建此列表時,將列表設置爲有序列表,如果存在特定值,則將其分配,如果不存在,則插入無。 即列表傑克應該像[78, 45, None, 94, 72]

編輯: 由於重新排序是一個問題,使用字典,該項目爲指標 即對傑克的值應該像{'Item1':78, 'Item2':45, 'Item4':94, 'Item5':72}

+0

這是一種解決方法。但正如我所說,這是一個更大的流程的一部分,改變訂單預處理或後處理並不適合這種情況。但是,是的,我們會嘗試一下,看看是否可以重新排列和項目後處理,而不會嚴重影響後面的代碼。 – chefsmart 2010-10-27 17:50:25

+0

或代替重新排序,請使用字典而不是列表,並將項目作爲索引。如果字典中存在值,則輸出值,否則顯示None。所以傑克值將變成:{'Item1':78,'Item2':45,'Item4':94,'Item5':72} – zsquare 2010-10-27 18:01:05