2012-03-17 46 views
0

我不知道怎樣來寫這一點,所以我將描述的情景:Django - 不支持字段編輯?

我設立了預算編制的方法。每個預算項目最多有3個類別(「主」,「子」和「子子」)。所以,我有這樣的:

model: Main_Category 
model: Sub_Category 
model: Sub_Sub_Category 

model: Budget_Item 
    field: Description 
    main_cat: FK --> Main_Category 
    sub_cat: FK --> Sub_Category 
    sub_sub_cat: FK --> Sub_Sub_Category 
    amount: decimal 
    item_used?: boolean 

現在,他們喜歡的用戶可以創建爲主要類別 - 他們可以創造出巨大的的「主」類,「分」的類別,並儘可能多的「子子列表「他們需要的類別。創建一個類別後,他們可以返回並編輯它(也許他們原來拼錯了它),甚至可以一起刪除這個類別。

然後,他們可以儘可能多地創建Budget_Items,按類別組織它們。當Budget_Item被「使用」(進行購買)時,isUsed字段被設置爲True

我要的是不允許編輯或刪除類別,如果這個類別已經「拿來主義」,通過購買。

例如:

我創建了一個main類名爲 「福樂」。我意識到我拼錯了,所以我編輯類別並稱之爲「燃料」。然後我創建了一個Budget_Item,其主要類別是「Fuel」,售價爲50美元。然後,我出去花50美元購買天然氣,並將我的Budget_Item標記爲「已用」。現在我已經使用了Budget_Item,我不想想要編輯類別「燃料」,我。該記錄需要以某種方式鎖定。

這是否有意義?這可能嗎?你使用Django管理

回答

1

爲了防止被刪除,您需要將on_delete = models.PROTECT參數傳遞到外鍵,這樣的類別:

class BudgetItem(models.Model): 
    .... 
    main_cat = models.ForeignKey(MainCategory, on_delete=models.PROTECT, related_name='budgets1') 
    sub_cat = models.ForeignKey(SubCategory, on_delete=models.PROTECT, related_name='budgets2') 
    sub_sub_cat = models.ForeignKey(SubSubCategory, on_delete=models.PROTECT, related_name='budgets3') 
    .... 

你可以在Django的documentation更多的刪除部分。

爲了防止模型被編輯您可以覆蓋保存每個分類模型的方法來檢測,如果類型模型具有已被通過購買使用的預算項目:

# Overriding the save method of the MainCategory model 
def save(self, *args, **kwargs): 
    # Checking if there aren't budget items that belongs to this category and 
    # has been used through a purchase so this category can be changed. 
    if not self.budgets1.filter(item_used=True).exists(): 
     super(MainCategory, self).save(*args, **kwargs) 

注意,部分自.budgets1是可能的,因爲related_name參數已傳遞到類別字段創建。

這段代碼僅僅是你可以做一個例子,但也有實現你想要的東西,它的檢測,如果類不能被修改,並從被保存在某種方式停止的伎倆很多方面。

0

假設,您可以覆蓋has_change_permissionhas_delete_permission方法爲您Category型號聯繫。

在這些方法中,您可以訪問類別對象,因此檢查是否有相關的Budget_Item s和isUsed設置爲True應該不會太困難。