РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
487 of 818 menu

Исключение ValidationError

Исключение ValidationError применяется для сообщения об ошибках валидации данных в Django. Оно обычно возникает при проверке данных модели или формы, когда переданные значения не соответствуют заданным правилам валидации. Исключение может быть выброшено в методах clean, clean_<field_name>, а также в пользовательских валидаторах.

ValidationError принимает несколько типов аргументов: строку с сообщением об ошибке, словарь с ошибками для разных полей или список сообщений. Оно также может содержать параметр code для категоризации ошибок и параметр params для динамической подстановки значений в сообщение.

Синтаксис

from django.core.exceptions import ValidationError raise ValidationError(message, code=None, params=None)

Пример . С моделью

Рассмотрим модель Article с пользовательской валидацией в методе clean:

from django.db import models from django.core.exceptions import ValidationError class Article(models.Model): title = models.CharField(max_length=100) status = models.CharField(max_length=20, default='draft') content = models.TextField() def clean(self): if self.status == 'published' and len(self.content) < 100: raise ValidationError( 'Published article must have at least 100 characters', code='content_too_short' ) if len(self.title) > 50: raise ValidationError( 'Title cannot exceed 50 characters', code='title_too_long' )

Пример . С формой

Использование ValidationError в методах валидации формы:

from django import forms from django.core.exceptions import ValidationError class ArticleForm(forms.Form): title = forms.CharField(max_length=100) content = forms.CharField(widget=forms.Textarea) def clean_title(self): title = self.cleaned_data['title'] if 'django' not in title.lower(): raise ValidationError( 'Title must contain the word "django"', code='missing_keyword' ) return title def clean(self): cleaned_data = super().clean() title = cleaned_data.get('title') content = cleaned_data.get('content') if title and content: if len(content) < len(title) * 2: raise ValidationError( 'Content must be at least twice as long as title', code='content_too_short' )

Пример . С обработкой исключения

Перехват и обработка ValidationError при сохранении модели:

from django.core.exceptions import ValidationError from myapp.models import Article article = Article( title='Hello Django', status='published', content='Short content' ) try: article.full_clean() article.save() except ValidationError as e: print(f"Validation error: {e.message}") print(f"Error code: {e.code}") if hasattr(e, 'error_dict'): for field, errors in e.error_dict.items(): for error in errors: print(f"{field}: {error.message}")

Результат выполнения кода:

"Validation error: Published article must have at least 100 characters" "Error code: content_too_short"

Пример . Со списком ошибок

Использование списка сообщений для нескольких ошибок:

from django.core.exceptions import ValidationError errors = [ 'Title is required', 'Content is too short', 'Status must be either draft or published' ] raise ValidationError(errors)

Пример . Со словарем ошибок

Передача словаря с ошибками для разных полей:

from django.core.exceptions import ValidationError error_dict = { 'title': [ 'Title cannot be empty', 'Title must contain at least 3 characters' ], 'content': ['Content cannot be empty'] } raise ValidationError(error_dict)

Пример . С параметром params

Использование параметра params для динамических сообщений:

from django.core.exceptions import ValidationError class ArticleValidator: def validate_title_length(self, title): min_length = 10 if len(title) < min_length: raise ValidationError( 'Title must be at least %(min_length)d characters long', code='title_too_short', params={'min_length': min_length} ) validator = ArticleValidator() try: validator.validate_title_length('Hello') except ValidationError as e: print(e.message) print(f"Minimum length: {e.params['min_length']}")

Результат выполнения кода:

"Title must be at least 10 characters long" "Minimum length: 10"

Смотрите также

  • исключение IntegrityError,
    которое возникает при нарушении целостности базы данных
  • исключение DoesNotExist,
    которое возникает при попытке получить несуществующий объект
  • исключение MultipleObjectsReturned,
    которое возникает при получении более одного объекта
  • исключение Http404,
    которое возникает при запросе несуществующей страницы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить