【发布时间】:2020-05-15 16:06:57
【问题描述】:
在下面的表格中,我声明了一个 clean() 方法,它正在评估以下条件:
expiration_date 是否在 created_date 之前?
如果该条件为真,我想提出一个ValidationError。运行测试时,我收到以下错误:AssertionError: ValidationError not raised by full_clean。
但是,如果调用 form.errors.as_data(),则会导致:{'expiration_date': [ValidationError(['The expiration date is set before the created date'])]}
能否解释一下发生了什么?
forms.py
class MenuForm(forms.ModelForm):
MENU_YEARS = [2019, 2020, 2021]
season = forms.CharField(
min_length=4,
validators=[validate_season]
)
items = forms.ModelMultipleChoiceField(
queryset=Item.objects.all(),
to_field_name='name'
)
expiration_date = forms.DateTimeField(
required=False,
widget=SelectDateWidget(
years=MENU_YEARS,
empty_label=("Choose Year", "Choose Month", "Choose Day")
)
)
def clean(self):
cleaned_data = super().clean()
created_date = cleaned_data['created_date'] = timezone.now()
expiration_date = cleaned_data['expiration_date']
if created_date > expiration_date:
raise ValidationError(
{'expiration_date': "The expiration date is set before the created date"}
)
class Meta:
model = Menu
fields = ['season', 'items', 'expiration_date']
test_forms.py
class TestMenuForm(TestCase):
@classmethod
def setUpTestData(cls):
cls.data = {
'season': 'Late Fall',
'items': ['Crepe'],
'expiration_date': datetime(2018, 1, 2)
}
def test_menu_model_clean(self):
with self.assertRaises(ValidationError):
self.menu_form.full_clean()
【问题讨论】:
-
查看文档here,您将参数传递给
ValidationError的方式不是文档显示的内容。你有没有尝试遵循?如果需要导入_,请参阅stackoverflow.com/a/1962289/6388133 -
我将验证错误修复为:
ValidationError(_("Invalid Expiration"), code="invalid_expiration"),但我仍然遇到同样的错误。
标签: python django unit-testing django-forms