为什么 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 文档了解更多信息。
当我在我的 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 文档了解更多信息。