首页 > 解决方案 > Django forms.validation 错误未显示

问题描述

我正在尝试使用用户内置的 djangos 创建一个注册表单。我想要一个密码字段,然后是第二个字段来验证密码是否匹配(请记住,这是一个新用户,因此数据库中尚不存在密码)。我想我真的很接近,似乎我需要验证错误从表单传递到视图。该表单只是清除我们的密码......并留下剩余的输入数据,但根本不会引发验证错误。非常感谢任何想法和帮助!

形式

class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    ver_password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': ' confirm password'}))
    ver_email = forms.EmailField(widget=forms.EmailInput(attrs={'placeholder': ' confirm email'}))

    class Meta():
        model = User
        fields = ('username',
                  'password',
                  'first_name',
                  'last_name',
                  'email')

    def clean(self):
        all_clean_data = super().clean()
        clean_email = all_clean_data['email']
        clean_ver_email = all_clean_data['ver_email']
        clean_password = all_clean_data['password']
        clean_ver_password = all_clean_data['ver_password']

        if clean_email != clean_ver_email:
            raise forms.ValidationError("Emails do not match")
        if clean_password != clean_ver_password:
            raise forms.ValidationError("Passwords do not match")

        return all_clean_data

看法

def register(request):

    registered = False
    newregister = False

    if request.method == 'POST':
        user_form = UserForm(data=request.POST)
        profile_form = UserProfileInfoForm(data=request.POST)

        if user_form.is_valid() and profile_form.is_valid():

            user = user_form.save()
            user.set_password(user.password)
            user.save(update_fields=['username','password','first_name','last_name','email'])

            profile = profile_form.save(commit=False)
            profile.user = user

            if 'profile_pic' in request.FILES:
                profile.profile_pic = request.FILES['profile_pic']

            profile.save()

            registered = True
            newregister = True
            return render(request, 'dai_members_app/login.html',
                                    {'user_form':user_form,
                                      'profile_form':profile_form,
                                      'registered':registered})
        else:
            print(user_form.errors,profile_form.errors)

标签: djangopython-3.xdjango-modelsdjango-formsdjango-views

解决方案


如果表单无效,您的视图不会返回任何内容。如果表单有效,它只会返回响应,这就是为什么“表单只是清除我们的密码......并留下剩余的输入数据”

其次,您的视图不寻常,因为通常表单视图同时处理 GET 请求(显示空白表单)和 POST 请求(验证和保存传入数据)。除非你有充分的理由去做不同的事情,否则至少在学习基础知识时应该坚持标准的 Django 模式。

有关表单处理的功能视图,请参阅 Django 文档中的示例: https ://docs.djangoproject.com/en/dev/topics/forms/#the-view

值得注意的是,Django 已经提供了用户注册的表单:from django.contrib.auth.forms import UserCreationForm. 你应该使用它而不是自己滚动,除非你需要做一些特别的事情,它看起来不像。

这里的教程也是一个很好的起点:https ://simpleisbetterthancomplex.com/tutorial/2017/02/18/how-to-create-user-sign-up-view.html


推荐阅读