Проверьте, имеет ли экземпляр Django ModelForm

Я хотел бы отобразить предупреждающее сообщение, если я вхожу в форму редактирования и спрячу его, если я в форме создания Django ModelForm.

form.is_bound скажите, была ли ранее заполнена форма, но как проверить, был ли ModelForm установлен с существующим экземпляром?

Я пробовал это hasattr(form.instance, 'pk'), но это правильный способ сделать это?

Приветствия,

Natim

Ответ 1

Попробуйте проверить, является ли form.instance.pk None.

hasattr(form.instance, 'pk') всегда будет возвращать True, поскольку каждый экземпляр модели имеет поле pk, даже если он еще не был сохранен в базе данных.

Как отметил @Paullo в комментариях, это не будет работать, если вы вручную определите свой первичный ключ и задаете значение по умолчанию, например, default=uuid.uuid4.

Ответ 2

Я столкнулся с этой проблемой, но в моем случае я использую UUID для PK. Хотя принятый ответ верен для большинства случаев, но не дает результатов, если вы не используете автоматическое увеличение PK по умолчанию в Django.

Определение свойства модели дает мне возможность получить доступ к этому значению из Model, View и Template как атрибута модели

@property
def from_database(self):
    return not self._state.adding

Ответ 3

Поскольку существующий экземпляр будет передан в качестве аргумента с ключевым словом instance для создания формы модели, вы можете наблюдать это в своем пользовательском инициализаторе.

class Foo(ModelForm):
    _newly_created: bool

    def __init__(self, *args, **kwargs):
        self._newly_created = kwargs.get('instance') is None
        super().__init__(*args, **kwargs)