为什么form._errors在generic.UpdateView中起作用,而在generic.CreateView中却不起作用?

时间:2019-03-20 00:19:51

标签: django django-forms mixins

当我在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)

1 个答案:

答案 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文档,以获取有关此信息的更多信息。