Ответ 1
изменить собственные данные в чистом методе, чтобы изменить отображаемое значение
Я добавляю пользовательскую проверку в свои формы и настраиваемые поля в приложении Django. Я хотел бы иметь возможность изменять значение поля при запуске ошибки. Например, если есть ошибка, форма должна быть перерисовлена с помощью значения поля, скорректированного с помощью clean(), и сообщение об ошибке "Данные были исправлены ниже. Нажмите" Сохранить снова ", чтобы подтвердить, соответствуют ли эти изменения"
Я попытался вернуть измененные данные в cleaned_data [], но это не сработает. Он корректно отображает ошибку, но значение поля не обновляется с исправленным HTML, когда форма повторно отображается.
class T34AtividadeForm(ModelForm):
def clean(self):
# Return cleaned html
error,html = fix_imgs(cleaned_data.get("a34_descricao"))
if error:
msg = u'Data has been corrected below. Click save again to confirm if these changes are OK';
self._errors['a34_descricao'] = ErrorList([msg])
# This doesn't work
cleaned_data["a34_descricao"] = html
# This doesn't work either
self.a34_descricao = html
return cleaned_data
Я также хотел бы сделать то же самое с полем, но поскольку ошибки вызваны исключением, у меня нет возможности вернуть исправленное значение. Как и метод clean(), ошибка отображается правильно, но значение не обновляется.
class HTMLField(CharField):
widget = HTMLTextarea
def clean(self, value):
value = super(HTMLField,self).clean(value)
error,html = fix_imgs(value)
if error:
# This doesn't work
self.value = html
raise forms.ValidationError(u'Data has been corrected below. Click save again to confirm if these changes are OK.')
return html
изменить собственные данные в чистом методе, чтобы изменить отображаемое значение
Способ обновления значения в clean() обновляет значение в словаре данных формы:
self.data["a34_stuff"] = "html"
Это работает точно.
Так я пытался и работал у меня:
inst = my_form.save(commit=False)
if not inst.a34_stuff: # or incorrect
inst.data["a34_stuff"] = "corrected"
Если ваша форма является образцовой формой, лучшим способом было бы получить экземпляр и исправить эти данные:
inst = my_form.save(commit=False)
if inst.a34_stuff is None: #or incorrect
inst.a34_stuff = "corrected"
request.user.message_set.create(message = "Error corrected")
return HttpResponseRedirect(reverse('your_url_name',
args=[])
PS: Я не уверен, что это действительно сработает... Не уверен, что форма изменит настройки.