Django - отключить редактирование модели - PullRequest
5 голосов
/ 29 февраля 2012

Есть ли способ, надеюсь, не нарушая admin, отключить редактирование существующих экземпляров модели на уровне ORM?

Я не говорю об удалении кнопок «Сохранить» и «Сохранить и продолжить» из шаблонов - не должно быть никаких операций, которые могут изменить значения зафиксированного экземпляра модели.

Желательно, чтобы вместо этого работала опция «Сохранить как».

Ответы [ 2 ]

8 голосов
/ 01 марта 2012

Перезаписать функцию сохранения для вашей модели следующим образом:

class MyModel(models.Model):

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

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

Эта функция вызывает функцию сохранения суперкласса (которая фактически сохраняет изменения), если нет pk, например, экземпляр модели новый.

4 голосов
/ 01 марта 2012

Вы можете переопределить 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;

В любом случае, администратор ничего не знал бы об этом, поэтому все по-прежнему выглядит редактируемым.Смотрите мой ответ на Вся модель как доступная только для чтения , чтобы попытаться сделать модель доступной только для чтения в админке.Для ваших целей сохраняйте разрешение на добавление как есть и объявляйте все поля только для чтения, когда не добавляете.

РЕДАКТИРОВАТЬ. Одной из причин, по которой переопределение delete () в вашем классе модели является небезопасным, является тот факт, чточто «массовое удаление» (Queryset.delete (), например, действие флажков администратора) не будет вызывать метод delete () отдельных экземпляров, оно перейдет прямо к SQL: https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects

...