Изменить значение поля формы Django во время clean () - PullRequest
21 голосов
/ 17 марта 2009

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

Ответы [ 5 ]

6 голосов
/ 17 марта 2009

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

3 голосов
/ 24 ноября 2015

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

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

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

1 голос
/ 25 декабря 2018

Можно изменить значение поля во время clean(), если вы обновите self.data атрибут формы. self.data является экземпляром класса QueryDict . По умолчанию керидикты являются неизменяемыми. Чтобы сделать их изменяемыми, вы должны использовать метод .copy(). Из документации:

QueryDicts в request.POST и request.GET будут неизменными при доступе в обычном цикле запрос / ответ. Чтобы получить изменяемую версию, вам нужно использовать QueryDict.copy ()

self.data = self.data.copy()
self.data['your_field'] = 'new value'
0 голосов
/ 21 июля 2011

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

 inst = my_form.save(commit=False)
 if not inst.a34_stuff: # or incorrect
     inst.data["a34_stuff"] = "corrected"
0 голосов
/ 18 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...