Подтвердить что ты не робот

Измените значение поля формы Django во время очистки()

Я добавляю пользовательскую проверку в свои формы и настраиваемые поля в приложении 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
4b9b3361

Ответ 1

изменить собственные данные в чистом методе, чтобы изменить отображаемое значение

Ответ 2

Способ обновления значения в clean() обновляет значение в словаре данных формы:

self.data["a34_stuff"] = "html"

Это работает точно.

Ответ 3

Так я пытался и работал у меня:

 inst = my_form.save(commit=False)
 if not inst.a34_stuff: # or incorrect
     inst.data["a34_stuff"] = "corrected"

Ответ 4

Если ваша форма является образцовой формой, лучшим способом было бы получить экземпляр и исправить эти данные:

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: Я не уверен, что это действительно сработает... Не уверен, что форма изменит настройки.