在自定义的Django表单中验证和显示错误信息

20 浏览
0 Comments

在自定义的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一样验证字段的内容。

0
0 Comments

问题的原因是作者使用了错误的方式为自定义的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'}))

是的,类似于这样。或者可以参考这个问题中的各种动态添加占位符的方法。

0