Django - 不喜欢现场编辑?

时间:2012-03-17 21:03:48

标签: 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

如果该类别已通过购买“使用”,我想要的是禁止编辑或删除类别。

例如:

我创建了一个名为“Fule”的main类别。我意识到我拼错了所以我编辑了类别并称之为“燃料”。然后我创建一个Budget_Item,其主要类别是“Fuel”,价格为50美元。然后我出去花费50美元用于加油,并将我的Budget_Item标记为“已用”。现在我已经使用Budget_Item,我希望能够编辑“Fuel”类别。该记录需要以某种方式锁定。

这有意义吗?这可能吗?

2 个答案:

答案 0 :(得分: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)   

请注意,self.budgets1部分是可能的,因为related_name参数已传递给类别字段创建。

此代码只是您可以执行的操作的一个示例,但有许多方法可以实现您想要的功能,检测类别是否无法修改并停止以某种方式保存。

答案 1 :(得分:0)

假设您使用的是Django管理员,则可以覆盖Category模型管理员的has_change_permissionhas_delete_permission方法。

在这些方法中,您可以访问类别对象,因此检查是否存在将Budget_Item设置为isUsed的相关True并非常困难。< / p>