为什么 form._errors 在 generic.UpdateView 中有效,但在 generic.CreateView 中无效?

Why form._errors is working in generic.UpdateView but not in generic.CreateView?

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

A CreateView 没有 instance,因为在构造表单时对象尚不存在。您可以这样做,而不是 form.instance

instance = form.save(commit=False)
# perform validation here
instance.save()
return super(AgePositiveMixin, self).form_valid(form)

年龄是否应该在任何地方都是正数(在 Django 管理界面,面向用户的表单中)?如果是这样,PositiveSmallIntegerField 将为您进行验证。

一般来说,我喜欢让验证尽可能靠近数据库。如果 PositiveSmallIntegerField 不适合您的用例,我建议您使用 validator。使用验证器,Django 将在管理、模型表单和其他任何地方为您执行验证。这对一致性很有帮助。

编辑:执行验证的另一种方法是以 class:

的形式进行
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 文档了解更多信息。