#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...

Комментарии • 37

  • @TSM_149
    @TSM_149 Год назад +5

    Сергей, не устану говорить спасибо! :-)
    Пусть ваш канал продвигается, вам успехов и здоровья!

  • @_mrmark
    @_mrmark Год назад +2

    Сергей, спасибо за подробное объяснение.

  • @gry_9595
    @gry_9595 Год назад +3

    спасибо, очень полезно и увлекательно, шикарная подача материала :)

  • @evgenyzakiev693
    @evgenyzakiev693 Год назад +1

    Спасибо, Сергей! Здоровья тебе🤝

  • @HeyArtem
    @HeyArtem 6 месяцев назад +2

    Спасибо за урок!

  • @игорянвасилюк
    @игорянвасилюк 9 месяцев назад +6

    если будет такая ошибка django.db.utils.IntegrityError: NOT NULL constraint failed: women_women.title, то можно исправить добавлением return title в функцию def clean_title. :)

  • @andredru4278
    @andredru4278 Год назад +1

    Спасибо. Это уже посложнее.

  • @HeyArtem
    @HeyArtem 6 месяцев назад +2

    У меня, когда браузер сообщает об ошибке, то на английском языке, хотя в настройках русский (и опера и хром) и в 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

  • @yaroslavandreevich4818
    @yaroslavandreevich4818 10 месяцев назад +2

    схожий вопрос с методом clean_title - действительно при вводе некорректных данных срабатывает ошибка и выводится текст требования к полю, но при корректном вводе title не попадает в cleaned_data в представлении addpage и поэтому выходит ошибка сохранения записи в БД, так как title=NULL
    То есть необходимо после проверки передать значение проверяемого поля в представление(как сделать это корректно?) На других полях такая же картина получается.

    • @selfedu_rus
      @selfedu_rus  10 месяцев назад

      проверьте, чтобы в конце возвращался title

    • @yaroslavandreevich4818
      @yaroslavandreevich4818 10 месяцев назад

      @@selfedu_rus , спасибо, это помогло.

  • @pavku
    @pavku 10 месяцев назад +2

    error_messages видим, только если удалить в браузере min_length. Но при перезагрузке страницы всё опять возвращается, как было. Вопрос, а зачем error_messages тогда вообще нужны?

    • @artemrokhmakov6373
      @artemrokhmakov6373 9 месяцев назад

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

    • @lama_instagrama1431
      @lama_instagrama1431 7 месяцев назад

      @@artemrokhmakov6373 Не совсем понятен ваш ответ.
      Если в форме у какого-нибудь поля прописан атрибут min_length, то проверка будет происходить в первую очередь на стороне клиента. Если по каким-то причинам на стороне клиента валидация не прошла (если пользователь поправил html код), то проверяет уже сервер (метод is_valid()).
      Наличие или отсутствие параметра error_messages никак не влияет на "уменьшение нагрузки на сервер". Просто визуальное отображение.
      Действительно, рядовые пользователи не будут править HTML код и, соответственно, никогда не увидят это сообщение, а для всяких хацкеров можно и не изменять дефолтное сообщение. Поэтому не понятно, зачем такой атрибут существует и юзает ли его кто-то в реальных проектах. Понятно, что мы тут изучаем возможности Django, поэтому оно тут есть. Но хотелось бы знать, надо ли это запоминать и активно применять?

  • @Developer_python_
    @Developer_python_ Год назад +1

    Why don't you use `clean`(checks all the fields) instead custome validator?

  • @dkproger
    @dkproger 8 месяцев назад +1

    Здравствуйте, столкнулся с тем что со стороны сервера не отображаются сообщения об ошибки в случае если удалить max_length, form.is_valid() принимает значение False, форма не отрабатывает, но и никаких сообщений об ошибке не отображает
    Такая же ситуация и с собственным валидатором, он работает но не отображает сообщение об ошибке

    • @selfedu_rus
      @selfedu_rus  8 месяцев назад

      это вопрос в ТГ-канал по Django

    • @dkproger
      @dkproger 8 месяцев назад +1

      решил проблему, в html файле вместо f.errors было f.error

  • @anykeyit6674
    @anykeyit6674 Год назад +2

    Не понял условие с set, объясните пожалуйста

    • @selfedu_rus
      @selfedu_rus  Год назад +2

      Это было в курсе "Добрый, добрый Python". Мы проверяем вхождение одного множества в другое.

    • @anykeyit6674
      @anykeyit6674 Год назад +2

      @@selfedu_rus спасибо нашел, урок 33, 07_40

    • @nto2503
      @nto2503 Год назад +4

      Это условное выражение на языке Python, которое проверяет, если множество value не содержит только символы, которые разрешены в множестве self.ALLOWED_CHARS. Давайте разберем это выражение по частям:
      set(value): Эта часть кода создает множество из элементов в переменной value. Множество в Python - это неупорядоченная коллекция уникальных элементов.
      set(self.ALLOWED_CHARS): Аналогично, это создает множество из элементов в self.ALLOWED_CHARS.
      set(value)

  • @HeyArtem
    @HeyArtem 6 месяцев назад +1

    У меня вот так закончилось:
    ....
    ...
    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)

  • @nto2503
    @nto2503 Год назад

    Метод def clean_title(self): работает, если вводить латиницу, но если ввести кириллицу, то 'title' становится None,

    • @selfedu_rus
      @selfedu_rus  Год назад +2

      возможно, в конце не прописали return title

    • @OxoTHuK13
      @OxoTHuK13 11 месяцев назад

      @@selfedu_rus Сергей, т.е. вы в конце функции clean_title забыли прописать retufn title и надо его прописать?
      Если да, то почему у вас сработало без return (в видео несколько раз пересмотрел этот момент, у вас нет возврата в данной функции). У меня без return выдаешь ошибку "Ошибка сохранения в БД", которая вызывается из нашего view.addpage().

  • @4itakMCBE
    @4itakMCBE 2 месяца назад

    5:09 15 строка: max length=255
    18 строка: MaxLengthValidator(100)
    Где логика?

  • @obyeboshen
    @obyeboshen Год назад +1

    почему вместо self.cleaned_data['title'] нельзя прописать self.title?

    • @selfedu_rus
      @selfedu_rus  Год назад +1

      cleaned_data - это понятный для меня словарь с проверенными (корректными данными), если self.title можно воспринимать также, то разницы нет

    • @obyeboshen
      @obyeboshen Год назад +1

      @@selfedu_rus спасибо)

  • @НиколайРоманов-е5г
    @НиколайРоманов-е5г 7 месяцев назад +1

    Скажите что у автора с Английским?
    все вроди бы не плохо, но слух подрезает

  • @kurbangasanov7180
    @kurbangasanov7180 Год назад +2

    php + mysql, пожалуйста!

  • @Klavdey
    @Klavdey Год назад +2

    А что с английским - текстара, месЕйджес, элау, клен, а_д_д? Отличный материал, но английский ...

    • @myxapg4758
      @myxapg4758 Год назад +9

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

    • @Klavdey
      @Klavdey Год назад

      @@myxapg4758 Просто режет слух и все

    • @ПолинаВолкова-б3у
      @ПолинаВолкова-б3у 8 месяцев назад +3

      Учите тогда на английском языке😡