Валидация модели 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)