Метод сохранения() пользовательской модели Django для неперсистентного атрибута

В методе сохранения пользовательской модели Django 4 save(), как передать непостоянное значение формы?

Например:

В приведенной ниже модельной форме непостоянное поле называется client_secret.

class ClientModelForm(forms.ModelForm):
    client_secret = forms.CharField(initial=generate_urlsafe_uuid)

Это поле никогда не будет сохранено, оно генерируется автоматически и потребуется для создания хэша для сохраняемого поля в методе save() моей модели.

class Client(models.Model):
    client_hash = models.BinaryField(editable=False, blank=True, null=True)

    def save(self, *args, **kwargs):
        """ Save override to hash the client secret on creation. """
        if self._state.adding:
            "GET THE CLIENT SECRET FROM THE FORM"
            client_hash = make_hash_key(client_secret)
            self.client_hash = client_hash

Как получить значение секрета клиента из приведенного выше примера кода формы? Является ли это наиболее подходящим подходом?

Вы должны вызвать метод сохранения суперкласса в конце следующим образом:

super(Client, self).save(*args, **kwargs)

Для сохранения формы необходимо добавить модель в класс Meta формы, а в представление добавить следующую логику:

form = Form(request.METHOD)
if form.is_valid():
    uuid = form.instance.client_secret
    form.save()

Где форма будет выглядеть так:

class ClientForm(forms.ModelForm):
    fields...
    class Meta:
        model = ClientModel

Настоятельно рекомендуем взглянуть на docs

Редактировать

Чтобы получить логику в сохранении модели, можно передать ее в kwargs сохранения, save(client_secret=client_secret), а затем в методе сохранения попробовать:

self.field = kwargs.get('client_secret')

тогда при сохранении формы, как показано выше, вы можете сделать

save(client_secret=uuid)
Вернуться на верх