2012-03-17 44 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应该不会太困难。