Очистка полей формы Django при ошибке проверки формы?

У меня есть форма Django, которая позволяет пользователю изменять свой пароль. Я сбиваю с толку на ошибку формы для полей, в которых все еще остаются данные.

Я пробовал несколько методов для удаления form.data, но я продолжаю получать This QueryDict instance is immutable сообщение об исключительном исключении.

Есть ли способ очистить отдельные поля формы или весь набор данных формы от clean() ?

Если вам нужна дополнительная проверка с использованием более одного поля из формы, переопределите метод .clean (). Но если это только для одного поля, вы можете создать метод clean_field_name ().

http://docs.djangoproject.com/en/1.1/ref/forms/validation/#ref-forms-validation

Что касается неизменяемой ошибки QueryDict, ваша проблема почти наверняка заключается в том, что вы создали свой экземпляр формы следующим образом:

 form = MyForm(request.POST) 

Это означает, что form.data это фактический QueryDict, созданный из валов POST. Поскольку сам запрос является неизменным, вы получаете сообщение об ошибке при попытке изменить что-либо в нем. В этом случае, говоря

 form.data['field'] = None 

это то же самое, что и

 request.POST['field'] = None 

Чтобы получить форму, которую вы можете изменить, вы хотите ее построить следующим образом:

 form = MyForm(request.POST.copy()) 

Кто-то показал мне, как это сделать. Этот метод работает для меня:

 post_vars = {} post_vars.update(request.POST) form = MyForm(post_vars, auto_id='my-form-%s') form.data['fieldname'] = '' form.data['fieldname2'] = '' 

Не можете ли вы просто удалить данные пароля из очищенных_файлов формы во время проверки?

См. Документы Django для пользовательской проверки (особенно второй блок кода).

Я только что создал форму снова.

Просто попробуй:

 form = AwesomeForm() 

а затем визуализируйте его.

В Django есть виджет, который делает это: https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#passwordinput

теперь, если вы не работаете с паролями, вы можете сделать что-то вроде этого:

 class NonceInput(Input): """ Hidden Input that resets its value after invalid data is entered """ input_type = 'hidden' is_hidden = True def render(self, name, value, attrs=None): return super(NonceInput, self).render(name, None, attrs) 

Конечно, вы можете сделать любой виджет django забудьте его значение, просто переопределив его метод рендеринга (вместо значения, которое я передал None в супервызове).

Я думаю, вам нужно использовать JavaScript, чтобы скрыть или удалить текст из контейнера.