Меню Закрыть

Django form is valid

Содержание

Теоретически пользователь может ввести в форму какие угодно данные и отправить их. Однако не все данные бывают уместными или корректными. Например, в поле для возраста пользователь может ввести отрицательное число, что вряд ли может считаться корректным возрастом. В этой связи для проверки корректности вводимых данных используется механизм валидации.

Правила валидации

Основным элементом валидаии являются правила, которые задают параметры корректности вводимых данных. Например, для всех поле по умолчанию устанавливается обязательность ввода значения. И при генерации html-кода для поля ввода устанавливается атрибут required . И если мы попробуем отправить форму, если какое-то из ее полей не введено никакого значения, то мы получим ошибку:

И нам надо будет обязательно ввести какое-то значение в незаполненное поле. Однако это не всегда нужно. Допустим, одно поле может иметь, а может не иметь значение. В этом случае мы можем отключить атрибут required:

Длина текста

Для полей, которые требуют ввода текста, например, CharField , EmailField и др., с помощью параметров max_length и min_length можно задать соответственно максимальную и минимальную длину вводимого текста в символах.

При генерации разметки для полей ввода будут устанавливаться атрибуты maxlength и minlength .

Минимальное и максимальное число

Для объектов IntegerField , DecimalField и FloatField можно устанавливать параметры max_value и min_value , которые задают соответственно максимально допустимое и минимально допустимое значение.

DecimalField дополнительно может принимать еще параметр decimal_places , который указывает на максимальное количество знаков после запятой.

is_valid

Выше рассмотренные атрибуты позволяют валидировать значения при вводе на стороне клиента. Однако практически пользователя, имея определенные навыки, могут все равно отправить форму с заведомо некорректными данными. Например, через инструменты для разработчиков в веб-браузере можно подправить исходный код формы, добавив ей атрибут noval >is_valid() , который возвращает True, если данные корректны, и False — если данные некорректны. Чтобы использоать этот метод, надо создать объект формы и передать ей пришедшие из запроса данные.

Итак, определим следующее представление в файле views.py :

Читайте также:  Pci ven 10de dev 03d6 subsys 03d61849

Если приходит POST-запрос, то в начале заполняем форму пришедшими данными:

Потом проверяем их корректность:

После проверки на валидность мы можем получить данные через объект cleaned_data (если данные корректны):

Если данные некорректны, можно предусмотреть альтернативный вывод:

Для тестирования формы можно установить у ней атрибут novalidate :

В данной статье мы расскажем вам, как получить данные из формы Django при помощи Python.

Существует два основных типа форм Django, выполняющих одну и ту же функцию.

Первый тип основан на классе форм Django.

Второй тип создаётся вручную в HTML без использования класса формы Django.

Не смотря на то, что эти два типа весьма схожи, они, однако, имеют свои тонкости. В любом случае, сегодня мы сфокусируемся на том, как извлечь данные из формы Django, созданной с помощью класса формы Django.

Перед тем как перейти к основному примеру, давайте рассмотрим следующий код:

Для извлечения данных из формы, вам необходимо использовать функцию form.is_valid () вместе с функцией form.cleaned_data.get (), передавая имя поля формы в эту функцию как параметр.

Рассмотрим небольшой пример. Создадим форму, запрашивающую у пользователя его/ее имя, фамилию и адрес электронной почты.

Файл forms.py

Ниже представлен код из файла forms.py:

Итак, имя формы — UserForm. Имеет 3 поля: first_name, last_name и email.

Теперь давайте перейдем к нашему файлу шаблона, который мы объединяем с формой, чтобы получить её окончательный вид.

Файл шаблона index.html

Ниже представлен код нашего шаблона index.html.

Итак, у нас тег , некоторый meta-тег, однако, форма находится в теле HTML-файла.

Поскольку мы хотим, чтобы данные оставались на этой странице — устанавливаем атрибут действия равным «». Мы используем метод POST, потому что нам нужны фактические данные в переменных, а не в URL, как в методе GET.

Строка защищает от подделки межсайтовых запросов.

При помощи строки << form.as_p >> наша форма отображается в файле шаблона.

Читайте также:  У 101 схема предварительного усилителя

После чего мы создаём кнопку submit и закрываем форму.

Следующий блок кода проверяет, была ли нажата кнопка submit. Если была, вывод отобразит данные, которые ввёл пользователь. Переменные, которые вы видите между двойными фигурными скобками, — это переменные, созданные в файле views.py, о котором мы поговорим далее.

Получение данных формы из файла views.py

Наконец, у нас есть файл views.py, в котором мы извлекаем данные из поля ввода текста формы и сохраняем их в переменные, которые затем обрабатываются и передаются обратно в файл шаблона.

Итак, мы получаем данные из формы через функции form.is_valid () и form.cleaned_data.get (), как показано ниже:

Первым делом нам необходимо получить данные при помощи кнопки submit. Сделать это можно с помощью функции request.POST.get(), передавая ей аргумент “submit”. Здесь мы узнаём о состоянии кнопки submit, либо None (изначально, т.е. если кнопка не нажата), либо “Submit” после нажатия.

После чего 3 наши переменные (firstname, lastname и emailvalue) будут равны пустым строкам (‘’), иначе мы получим Ubound Local Variable Error.

Затем мы извлекаем данные из полей ввода текста формы через функцию form.cleaned_data.get (), в которой указываем имя поля формы. Мы просто храним эти значения в переменных.

Однако мы должны передать форму через функцию is_valid (). Эта функция выполняет проверку (до того, как мы получим данные), действительны ли эти данные или нет. Если данные недействительны, то мы не будем их извлекать. В противном случае — мы получаем “очищенные” данные (cleaned_data). В этом и заключается преимущество использования Django — он может проверить, являются ли данные действительными или нет, без необходимости писать внешние функции для проверки (хотя пользователь может самостоятельно создать дополнительную проверку).

Вернёмся к формам Django.

Итак, мы создаём переменную firstname и устанавливаем её равной form.cleaned_data.get (‘first_name’). Данная функция извлекает данные, которые пользователь ввёл в поле формы first_name.

Читайте также:  Iptv управление просмотром что это

Затем мы создаём переменную lastname и устанавливаем её равной form.cleaned_data.get (‘last_name’). Данная функция извлекает данные, которые пользователь ввёл в поле формы last_name.

Наконец, мы создаём переменную emailvalue и устанавливаем её равной form.cleaned_data.get (’email’). Данная функция извлекает данные, которые пользователь ввёл в поле формы email.

Это все наши переменные. Затем мы передаём их в файл шаблона через контекстный словарь. Таким образом, мы можем вывести результаты в файле шаблона.

Таким образом мы можем получить данные из формы Django. Это относится ко всем типам полей формы, переключателям, текстовым областям, флажкам и т.д. Мы можем извлечь данные из этих полей формы с помощью функции form.cleaned_data.get ().

После чего мы можем обработать эти данные так, как мы хотим.

Спасибо за внимание! Надеемся, что данная статья помогла вам.

I am trying to create a registration form using django, when I submit my form the is valid() function fails and I am not sure why. I have my registration and login page all on one html page, although, I have called all the field names different names, eg login_username.

2 Answers 2

Right now your form is always empty and therefore invalid. You forgot to add the request POST content to the form.

If you get stuck when calling .is_valid() , you can print(regForm.errors) to see what’s up.

You have two main problems. Firstly, you are never passing the POST data to the form, so it can never be valid.

Secondly, for some reason you are ignoring everything that the form could tell you about why it is not valid, and always returning "usernames didn’t match". What’s more, you’re not even doing anything to compare usernames, so that error message will never be accurate.

You should rework your view to follow the pattern as described in the documentation:

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.