#46. Валидация полей формы. Создание пользовательского валидатора | Уроки по Django 4
HTML-код
- Опубликовано: 18 ноя 2024
- Практический курс по Django: stepik.org/a/1...
Телеграм-канал Django: t.me/django_se...
Инфо-сайт: proproprogs.ru...
Порядок выполнения валидации полей формы. Добавление собственных (пользовательских) валидаторов через параметр validators и метод clean_().
46_sitewomen.zip: github.com/sel...
Классы и параметры полей формы: docs.djangopro...
Сергей, не устану говорить спасибо! :-)
Пусть ваш канал продвигается, вам успехов и здоровья!
Сергей, спасибо за подробное объяснение.
спасибо, очень полезно и увлекательно, шикарная подача материала :)
Спасибо, Сергей! Здоровья тебе🤝
Спасибо за урок!
если будет такая ошибка django.db.utils.IntegrityError: NOT NULL constraint failed: women_women.title, то можно исправить добавлением return title в функцию def clean_title. :)
Спасибо. Это уже посложнее.
У меня, когда браузер сообщает об ошибке, то на английском языке, хотя в настройках русский (и опера и хром) и в settings.py (LANGUAGE_CODE = 'ru-ru').
Формат типа:
error_messages={
'min_length': 'Слишком короткий заголовок',
'required': 'Без заголовка никак',
}
Не срабатывает, тольк от браузера идут сообщения
И если поставить
max_length=6, то болше 6 символов набрать не получится
При использовании валидатора
validators=[
MinLengthValidator(5, message="Нужно 5 символов"),
MaxLengthValidator(100, message="Максимум 100 символов"),
],
долго не срабатовало, пока не увидел, что нужно убрать min_length
схожий вопрос с методом clean_title - действительно при вводе некорректных данных срабатывает ошибка и выводится текст требования к полю, но при корректном вводе title не попадает в cleaned_data в представлении addpage и поэтому выходит ошибка сохранения записи в БД, так как title=NULL
То есть необходимо после проверки передать значение проверяемого поля в представление(как сделать это корректно?) На других полях такая же картина получается.
проверьте, чтобы в конце возвращался title
@@selfedu_rus , спасибо, это помогло.
error_messages видим, только если удалить в браузере min_length. Но при перезагрузке страницы всё опять возвращается, как было. Вопрос, а зачем error_messages тогда вообще нужны?
уменьшить нагрузку запросов на сервер, обыкновенный пользователь заниматься таким не будет, да и опытный так точно, правильная архитектура валидации построена исключительно на сервере. Изменением html-документа занимаются только мамины хацкеры😉
@@artemrokhmakov6373 Не совсем понятен ваш ответ.
Если в форме у какого-нибудь поля прописан атрибут min_length, то проверка будет происходить в первую очередь на стороне клиента. Если по каким-то причинам на стороне клиента валидация не прошла (если пользователь поправил html код), то проверяет уже сервер (метод is_valid()).
Наличие или отсутствие параметра error_messages никак не влияет на "уменьшение нагрузки на сервер". Просто визуальное отображение.
Действительно, рядовые пользователи не будут править HTML код и, соответственно, никогда не увидят это сообщение, а для всяких хацкеров можно и не изменять дефолтное сообщение. Поэтому не понятно, зачем такой атрибут существует и юзает ли его кто-то в реальных проектах. Понятно, что мы тут изучаем возможности Django, поэтому оно тут есть. Но хотелось бы знать, надо ли это запоминать и активно применять?
Why don't you use `clean`(checks all the fields) instead custome validator?
Здравствуйте, столкнулся с тем что со стороны сервера не отображаются сообщения об ошибки в случае если удалить max_length, form.is_valid() принимает значение False, форма не отрабатывает, но и никаких сообщений об ошибке не отображает
Такая же ситуация и с собственным валидатором, он работает но не отображает сообщение об ошибке
это вопрос в ТГ-канал по Django
решил проблему, в html файле вместо f.errors было f.error
Не понял условие с set, объясните пожалуйста
Это было в курсе "Добрый, добрый Python". Мы проверяем вхождение одного множества в другое.
@@selfedu_rus спасибо нашел, урок 33, 07_40
Это условное выражение на языке Python, которое проверяет, если множество value не содержит только символы, которые разрешены в множестве self.ALLOWED_CHARS. Давайте разберем это выражение по частям:
set(value): Эта часть кода создает множество из элементов в переменной value. Множество в Python - это неупорядоченная коллекция уникальных элементов.
set(self.ALLOWED_CHARS): Аналогично, это создает множество из элементов в self.ALLOWED_CHARS.
set(value)
У меня вот так закончилось:
....
...
title = forms.CharField(
# min_length=5,
max_length=255,
label='Заголовок',
widget=forms.TextInput(attrs={'class': 'form-input'}),
validators=[
MinLengthValidator(5, message="Нужно 5 символов"),
MaxLengthValidator(100, message="Максимум 100 символов"),
],
...
...
def clean_title(self):
title = self.cleaned_data['title']
ALLOWED_CHARS = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщбыъэюя0123456789- "
if not (set(title)
Метод def clean_title(self): работает, если вводить латиницу, но если ввести кириллицу, то 'title' становится None,
возможно, в конце не прописали return title
@@selfedu_rus Сергей, т.е. вы в конце функции clean_title забыли прописать retufn title и надо его прописать?
Если да, то почему у вас сработало без return (в видео несколько раз пересмотрел этот момент, у вас нет возврата в данной функции). У меня без return выдаешь ошибку "Ошибка сохранения в БД", которая вызывается из нашего view.addpage().
5:09 15 строка: max length=255
18 строка: MaxLengthValidator(100)
Где логика?
почему вместо self.cleaned_data['title'] нельзя прописать self.title?
cleaned_data - это понятный для меня словарь с проверенными (корректными данными), если self.title можно воспринимать также, то разницы нет
@@selfedu_rus спасибо)
Скажите что у автора с Английским?
все вроди бы не плохо, но слух подрезает
php + mysql, пожалуйста!
лучше js + postgreSQL)
А что с английским - текстара, месЕйджес, элау, клен, а_д_д? Отличный материал, но английский ...
У каждого человека есть области, в которых он профессионал, и области, в которых он новичок. Если углубиться в одну область, не останется времени для другой. Тут каждый уже сам расставляет приоритеты. Не понимаю почему вас беспокоит произношение слов на английском, если мы все сюда пришли с целью освоения django, а не английского. Тем более сам курс на ютубе бесплатный
@@myxapg4758 Просто режет слух и все
Учите тогда на английском языке😡