2010-03-01 3 views
7

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

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

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

+0

вы можете использовать javascript, который будет работать в 95% случаев в соответствии с: http://www.w3schools.com/browsers /browsers_stats.asp; Пример: http: //www.learningjquery.com/2007/08/clearing-form-data – miku

ответ

0

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

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

+0

Игорь, я знаю, как проверить форму. Проблема в том, когда проверка не выполняется, я хочу, чтобы поле формы было пустым, а не данные, предоставленные пользователем. – ChrisW

+3

Игорь на правильном пути, однако, ChrisW. IMO, вы должны использовать метод clean() для проверки двух паролей - и если они не корректно очищают поля self.data <в этой точке>, перед повышением ошибки проверки. – pithyless

+0

Может кто-то уточнить немного больше. Когда я пытаюсь self.data ['field'] = None перед повышением validationError, ничего не происходит, и ошибка проверки даже не повышается. – joshcartme

-2

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

+0

Конечно, должен быть способ сделать это на стороне сервера ... в зависимости от клиентского JavaScript это довольно грязный способ сделать это. – ChrisW

2

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

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

Это работает, но это не очень чисто, так как вы делаете это на уровне просмотров. IMO, вы должны подклассифицировать форму входа по умолчанию и заменить метод clean(), как предложил Игорь. То есть сначала подтвердите, что они верны; очистите соответствующие поля self.data и, наконец, поднимите ValidationError. – pithyless

+0

любой шанс, который вы могли бы разработать? Я все еще получаю неизменные ошибки запроса. – joshcartme

+0

post_vars.update (request.POST) - это менее чистый способ делать dict (request.POST). В любом случае значения, представленные формой, которую вы не переопределяете с помощью form.data, оказываются в отображаемой форме как u '' (не уверен, почему это происходит). Используя request.POST.copy(), как было предложено @Ian, он работал как шарм. – Josh

6

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

form = MyForm(request.POST) 

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

form.data['field'] = None 

точно так же, как

request.POST['field'] = None 

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

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

Обратите внимание, что для поля файла или поля изображения в форме вам необходимо будет установить form.files, а не form.data таким же образом. – krypto07

0

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

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

form = AwesomeForm() 

, а затем сделать его.

0

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) 

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

Смежные вопросы