簡體   English   中英

Django model 驗證未在 full_clean() 上引發異常

[英]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)

為什么這不會引發異常? (我已經嘗試在ModelFormModel上執行full_clean() ,但都沒有引發異常)

驗證器應該在不滿足條件的情況下引發ValidationError ,而不是返回TrueFalse ,因此:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM