在自定义的Django表单中验证和显示错误信息
在自定义的Django表单中验证和显示错误信息
当我使用form.as_p
来显示我的表单时,例如,如果我点击提交按钮而没有填写任何字段,它会显示错误信息要求我填写必填字段。然而,当我自定义我的html模板的输出时,它不会验证字段并且不会显示任何错误信息。我的forms.py文件如下所示:
# forms.py class SignUpForm(forms.ModelForm): username = forms.CharField(label='用户名', max_length=75, widget=forms.TextInput(attrs={'placeholder' : '用户名'})) email = forms.EmailField(label='电子邮件', max_length=255) first_name = forms.CharField(label='名字', max_length=75) last_name = forms.CharField(label='姓氏', max_length=75) birthday = forms.DateField(label='生日') gender = forms.ChoiceField(choices = User.GENDER_CHOICES) class Meta: model = User fields = ['username', 'password', 'email', 'first_name', 'last_name', 'birthday', 'gender'] widgets = { 'password': forms.PasswordInput(attrs={'class': 'form-control'}), 'email': forms.EmailInput(attrs={'class': 'form-control'}), 'birthday': forms.DateInput(attrs={'class': 'form-control'}), } def save(self, commit=True): user = super(SignUpForm, self).save(commit=False) user.username = self.cleaned_data['username'] user.set_password(self.cleaned_data['password']) user.email = self.cleaned_data['email'] user.first_name = self.cleaned_data['first_name'] user.last_name = self.cleaned_data['last_name'] user.birthday = self.cleaned_data['birthday'] user.gender = self.cleaned_data['gender'] if commit: user.save() return user
我的HTML模板如下所示:
# registration.html
我现在刚开始学习Django,我阅读了关于自定义表单的文档,但是我没有找到关于如何像forms.as_p
一样验证字段的内容。
问题的原因是作者使用了错误的方式为自定义的Django表单生成HTML。解决方法是使用Django表单字段(例如{{ form.first_name }}
)而不是手动创建HTML版本并填充它们。
然而,问题比这更简单:你忘记了为每个字段添加{{ form.myfield.errors }}
以及在表单顶部添加{{ form.non_field_errors }}
。
另外,请注意在save
方法中没有必要做额外的工作。所有这些字段已经由超类设置:你只需要手动处理user.set_password
这一项。
正确的方法是什么?我需要创建类似于这样的东西吗?username = forms.CharField(label='Username', max_length=75, widget=forms.TextInput(attrs={'placeholder' : 'Username', 'class' : 'form-control'}))
。
是的,类似于这样。或者可以参考这个问题中的各种动态添加占位符的方法。