当我在mixins中使用它
form._errors[forms.forms.NON_FIELD_ERRORS]=ErrorList(["age must be positive"])
在我的UpdateView中可以正常工作,并且消息以红色弹出。但是在我的CreateView中,什么都没有弹出
我该如何实现? 这是我的 mixin.py :
class AgePositiveMixin(object):
def form_valid(self, form):
print(form.instance.age)
if form.instance.age>0:
return super(AgePositiveMixin, self).form_valid(form)
else:
form._errors[forms.forms.NON_FIELD_ERRORS]=ErrorList(["Age must be positive"])
# raise forms.ValidationError('Age must be positive')
return self.form_invalid(form)
答案 0 :(得分:2)
CreateView
没有instance
,因为构造表单时对象尚不存在。您可以执行以下操作来代替form.instance
:
instance = form.save(commit=False)
# perform validation here
instance.save()
return super(AgePositiveMixin, self).form_valid(form)
年龄是否应该在所有地方都是正数(在Django admin中,面向用户的形式)?如果是这样,PositiveSmallIntegerField
将为您进行验证。
通常,我想使验证尽可能地靠近数据库。如果该PositiveSmallIntegerField
不适合您的用例,建议您使用validator。借助验证器,Django将在管理员,模型表单以及其他任何位置为您执行验证。保持一致性非常好。
编辑:执行验证的另一种方法是在表单类中进行验证:
class UserForm(forms.ModelForm):
class Meta:
model = User
def clean_age(self):
age = self.cleaned_data['age']
if not age > 0:
raise forms.ValidationError("Age must be positive")
return age
请查看Django的Form and field validation文档,以获取有关此信息的更多信息。