Django-禁用模型编辑

Django-禁用模型编辑,django,django-admin,Django,Django Admin,有没有一种方法,希望在不破坏管理的情况下,禁止在ORM级别编辑现有的模型实例 我不是说从模板中删除“保存”和“保存并继续”按钮-不应该有任何操作可以更改模型的已提交实例的值 最好使用“另存为”选项 覆盖模型的保存功能,如下所示: class MyModel(models.Model): def save(self, *args, **kwargs): if self.pk is None: super(MyModel, self).save(*

有没有一种方法,希望在不破坏管理的情况下,禁止在ORM级别编辑现有的模型实例

我不是说从模板中删除“保存”和“保存并继续”按钮-不应该有任何操作可以更改模型的已提交实例的值


最好使用“另存为”选项

覆盖模型的保存功能,如下所示:

class MyModel(models.Model): def save(self, *args, **kwargs): if self.pk is None: super(MyModel, self).save(*args, **kwargs) 类MyModel(models.Model): def保存(自身、*args、**kwargs): 如果self.pk为无: 超级(MyModel,self).save(*args,**kwargs)
此函数仅在没有pk的情况下调用超类保存函数(实际保存更改),例如模型实例是新的。

您可以覆盖模型类的save()(如果self.pk,则不执行任何操作)和delete(始终不执行任何操作)

但实际上,数据库级别是最安全的地方。例如,在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;
不管怎样,管理员都不知道这件事,所以一切看起来都是可编辑的。请参阅我对的回答,以尝试在管理中使模型只读。出于您的目的,请保持“添加”权限不变,并且仅在不添加时将所有字段声明为只读


编辑:在模型类中重写delete()不安全的一个原因是,“批量删除”(Queryset.delete(),例如admin复选框操作)不会调用单个实例的delete()方法,它将直接转到SQL:

我不喜欢这种方法的一点是,单击save之后仍然有消息“这个。。。已成功更改。“,尽管未更改任何内容。是否有方法将此消息更改为“更改已禁用”?或者更好的方法是,禁用对该行的单击?是否有方法阻止
MyModel.objects.filter(pk=my_model.pk).update(name=“bob”)
谢谢您的回答。我正在试图找出如何在models.py上传递这些规则。我找到的文档中最相关的部分是。您能举一个简单的例子来说明这种方法吗?上面的SQL语句只执行一次,您可以任意选择。一旦规则在Postgres中,它就会被遵守。因此您可以使用psql来实现这一点。如果您使用South进行模型迁移,我建议您使用自定义迁移,db.execute()执行规则。请参见示例答案