【问题标题】:Custom form using User model使用用户模型的自定义表单
【发布时间】:2016-01-04 21:12:07
【问题描述】:

我有一个使用 User 模型注册用户的表单。

表格:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'password']

模板:

{% block content %}
    <p>Register</p>
    {{ user_form.as_p }}
{% endblock %}

views.py:

def register_view(request):
    if request.method == "POST":
        user_form = UserForm(request.POST)
        if user_form.is_valid:
            user = user_form.save()
            return  HttpResponseRedirect('/account/registered/')
    else:
        user_form = UserForm()
    return render(request, 'register_view.html', {
        'user_form': user_form
    })

但我需要在表单中添加额外的功能:

  1. 显示电子邮件字段两次并在提交时验证两个电子邮件字段。
  2. 密码的最小长度为 8 个字符。

我尝试在字段列表中设置电子邮件字段两次:

fields = ['first_name', 'last_name', 'username', 'email', 'password']

但它只显示一个电子邮件字段。

如何根据需要使用 ModelForm 自定义表单?

更新

使用答案更新了我的表单,但现在我收到了错误:

/account/register/处的KeyError

'确认电子邮件'

更新表格:

class UserForm(forms.ModelForm):
    confirm_email = forms.EmailField(label="Confirm email")

    def clean(self):
        email = self.cleaned_data['email']
        confirm_email = self.cleaned_data['confirm_email']
        password = self.cleaned_data['password']

        if email != confirm_email:
            raise ValidationError({'confirm_email': "Both email doesn't match."})

        if len(password) < 8:
            raise ValidationError({'password': "Password should be of minimum 8 characters."})

        return super(UserForm, self).clean()

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'confirm_email', 'password']

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您应该在表单中创建第二个字段email,并在clean 方法中验证两封电子邮件是否相同,如下所示:

    class UserForm(forms.ModelForm):
        confirm_email = forms.EmailField(label="Confirm email")
    
        def clean(self):
            email = self.cleaned_data['email']
            confirm_email = self.cleanded_data['confirm_email']
    
            if email != confirm_email:
                raise ValidationError({'confirm_email': "provided email doesn't match with above one"})
    
            return super(UserForm, self).clean()
    
        class Meta:
            model = User
            fields = ['first_name', 'last_name', 'username', 'email', 'password']
    

    您应该对密码执行相同的操作。请记住使用set_password 方法在您的用户上保存实际密码,不要将原始密码存储在数据库中。

    【讨论】:

    • 感谢您的回答,我已经更新了我的表单,但现在我收到了这个错误:KeyError at /account/register/ 'confirm_email'。你能帮我解决这个问题吗?我还使用您的回答更新了问题中的表格。请帮帮我。
    猜你喜欢
    • 2012-05-01
    • 2015-01-15
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2015-11-28
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多