Метод сохранения() пользовательской модели 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)