2012-02-29 54 views
5

是有办法,有希望在不破坏管理,禁止对ORM水平编辑现有的模型实例?Django的 - 禁用模型编辑

我不是在谈论删除“保存”和“保存并继续”从模板按钮 - 应该没有操作,可以改变模型的承诺实例的值。

最好,“另存为”选项,应改为工作。

回答

8

覆盖保存功能的模型,像这样:

 
class MyModel(models.Model): 

    def save(self, *args, **kwargs): 

     if self.pk is None: 
      super(MyModel, self).save(*args, **kwargs) 

此功能仅调用父类的保存功能(这实际上节省了变化),如果没有PK,例如模型实例是新的。

+3

我不喜欢这种方法是,点击保存后仍然有消息“The ... was changed changed。”,所以没有任何改变。有没有办法将此消息更改为“更改已禁用”?或者甚至更好,禁用点击该行? – WebOrCode 2013-12-04 13:04:41

+3

是否有办法防止'MyModel.objects.filter(PK = my_model.pk).update(NAME = “鲍勃”)' – 2014-08-04 21:59:19

4

你可以重写你的模型类的save()(做什么,如果self.pk)和删除(总是什么都不做)

但实际上,数据库层面是针对最安全的地方。例如,在PostgreSQL里你可以写两个简单的规则:

CREATE RULE noupd_myapp_mymodel AS ON UPDATE TO myapp_mymodel 
    DO NOTHING; 
CREATE RULE nodel_myapp_mymodel AS ON DELETE TO myapp_mymodel 
    DO NOTHING; 

无论哪种方式,管理员不会知道这事,所以一切看起来还是编辑。查看我对Whole model as read-only的回答,试图在管理员中使模型只读。出于您的目的,请按原样保留添加权限,并且仅在未添加时声明所有字段为只读。

编辑:在您的模型类中重写delete()不安全的一个原因是“批量删除”(Queryset.delete(),例如admin复选框操作)不会调用单个实例的delete( )方法,它会直接进入SQL:https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects

+0

谢谢你这个答案。我想弄清楚如何在models.py上传递这些规则。我发现的文件最相关的部分是[执行自定义SQL直接](https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly)。你能举一个简单的例子来说明这种方法吗? – raratiru 2014-03-27 22:49:18

+1

上面的SQL statemtents只执行一次,你喜欢的任何方式。一旦规则在Postgres中,它将被遵守。所以你可以使用psql来做到这一点。如果你使用South进行模型迁移,我会推荐一个自定义迁移db.execute()的规则。请参阅例如答案http://stackoverflow.com/a/5466251/640759 – 2014-03-28 00:23:24