Очистка полей формы Django при ошибке проверки формы? - PullRequest
7 голосов
/ 01 марта 2010

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

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

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

Ответы [ 7 ]

6 голосов
/ 11 октября 2011

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

form = MyForm(request.POST)

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

form.data['field'] = None

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

request.POST['field'] = None

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

form = MyForm(request.POST.copy())
2 голосов
/ 01 марта 2010

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

post_vars = {}  
post_vars.update(request.POST)  
form = MyForm(post_vars, auto_id='my-form-%s')  
form.data['fieldname'] = ''  
form.data['fieldname2'] = ''
0 голосов
/ 09 мая 2015

У 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 в супер вызове).

0 голосов
/ 30 августа 2012

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

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

form = AwesomeForm()

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

0 голосов
/ 17 мая 2010

Разве вы не можете просто удалить данные пароля из cleaned_data формы во время проверки?

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

0 голосов
/ 01 марта 2010

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

0 голосов
/ 01 марта 2010

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

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

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