[英]Django model validation not raising Exception on full_clean()
我有一個Model
和帶有自定義驗證器的ModelForm
(在 CharField 中只允許“H”或“A”):
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']
但是,當我使用另一個值(不是 H 或 A)運行 full_clean() 時,它不會引發驗證異常:
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)
為什么這不會引發異常? (我已經嘗試在ModelForm
和Model
上執行full_clean()
,但都沒有引發異常)
驗證器應該在不滿足條件的情況下引發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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.