Валидация модели Django не поднимает исключение при full_clean()

У меня есть Model и ModelForm с пользовательским валидатором (который разрешает только "H" или "A" в CharField):

def home_away_valid(value):
    return value == 'H' or value == 'A'


class Team(models.Model):
    name = models.CharField(max_length=180)
    home = models.CharField(max_length=2, validators=[home_away_valid], default='H', db_index=True)


class TeamForm(ModelForm):
    class Meta:
        model = Team
        fields = ['home', 'name']

Однако, когда я запускаю full_clean() с другим значением (не H или A), это не вызывает исключения проверки:

try:
    team = TeamForm({
        'name': 'Test Team',
        'home': 'S'
    })
    team.full_clean()
    new_team = team.save()
    print(new_team.id)
except ValidationError as e:
    print(e)

Почему это не вызывает исключения? (Я пробовал делать full_clean() и на ModelForm, и на Model, ни один из них не вызывает исключения)

Валидатор должен выдать ошибку ValidationError в случае, если условие не выполнено, а не возвращать True или False, так:

from django.core.exceptions import ValidationError

def home_away_valid(value):
    if value not in ('H', 'A'):
        raise ValidationError('Must be home or away')

Вы также можете захотеть использовать 'H' и 'A' в качестве вариантов выбора, это сделает форму с ChoiceField менее вероятной для ошибок:

class Team(models.Model):
    HOME_AWAY = (
        ('H', 'Home'),
        ('A', 'Away')
    )

    name = models.CharField(max_length=180)
    home = models.CharField(max_length=2, choices=HOME_AWAY, validators=[home_away_valid], default='H', db_index=True)
Вернуться на верх