【问题标题】:Django - disable model editingDjango - 禁用模型编辑
【发布时间】:2012-03-19 05:58:20
【问题描述】:

有没有办法在不破坏管理员权限的情况下禁用在 ORM 级别上编辑现有模型实例?

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

最好使用“另存为”选项。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您可以覆盖模型类的 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(),例如管理员复选框操作)不会调用单个实例的 delete()方法,它将直接进入SQL:https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects

    【讨论】:

    • 感谢您的回答。我试图弄清楚如何在models.py上传递这些规则。我找到的文档中最相关的部分是Executing custom SQL directly。您能否举一个简单的例子来说明这种方法?
    • 以上 SQL 语句只执行一次,任何你喜欢的方式。一旦规则在 Postgres 中,它将被遵守。所以你可以使用 psql 来做到这一点。如果您使用 South 进行模型迁移,我建议您使用 db.execute() 规则的自定义迁移。参见例如答案stackoverflow.com/a/5466251/640759
    【解决方案2】:

    像这样覆盖模型的保存函数:

    类 MyModel(models.Model): def 保存(自我,*args,**kwargs): 如果 self.pk 为无: super(MyModel, self).save(*args, **kwargs)

    如果没有pk,这个函数只调用超类save函数(实际上是保存更改),例如模型实例是新的。

    【讨论】:

    • 我不喜欢这种方法的是,点击保存后仍有消息“...已成功更改。”,尽管没有任何更改。有没有办法将此消息更改为“更改已禁用”?或者更好的是,禁用点击该行?
    • 有没有办法防止MyModel.objects.filter(pk=my_model.pk).update(name="bob")
    猜你喜欢
    • 1970-01-01
    • 2010-12-29
    • 2012-01-16
    • 2018-10-28
    • 2018-11-30
    • 2017-11-22
    • 2012-12-26
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多