在Django中更新配置文件时,在User模型上允许空白密码字段

时间:2012-12-18 11:39:23

标签: django django-forms

已修改为包含代码

class UserForm(UserCreationForm):

    def __init__(self, *arg, **kw):
        super(UserForm, self).__init__(*arg, **kw)

        # re-order so email appears last on this form
        email_field = self.fields.pop('email')
        self.fields['email'] = email_field


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

我有一个表单,用户可以更新他们的个人资料详细信息。

用户可以选择更新他们的passwords,但不需要更新其他个人资料字段。

问题是,当passwordpassword confirmation字段为空时,我的验证工作正在进行中。

我认为User模型Password字段是required=Trueblank=False字段,因此我需要一种在此模型上验证时忽略表单空白输入的方法。

User模型是随Django一起提供的模型:

from django.contrib.auth.models import User

由于

2 个答案:

答案 0 :(得分:12)

UserCreationForm旨在用于创建。创建一个新的ModelForm比使用这个更好。

class UserUpdateForm(forms.ModelForm):
    # Feel free to add the password validation field as on UserCreationForm
    password = forms.CharField(required=False, widget=forms.PasswordInput)

    class Meta:
        model = User
        # Add all the fields you want a user to change
        fields = ('first_name', 'last_name', 'username', 'email', 'password') 

    def save(self, commit=True):
        user = super(UserUpdateForm, self).save(commit=False)
        password = self.cleaned_data["password"]
        if password:
            user.set_password(password)
        if commit:
            user.save()
        return user

或者如果你想继承我不推荐的UserCreationForm。你可以这样做:

class UserForm(UserCreationForm):
    password1 = forms.CharField(label=_("Password"), required=False
                            widget=forms.PasswordInput)
    password2 = forms.CharField(label=_("Password confirmation"),
                            widget=forms.PasswordInput, required=False)
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'username', 'email')

    def save(self, commit=True):
        user = super(UserUpdateForm, self).save(commit=False)
        password = self.cleaned_data["password"]
        if password:
            user.set_password(password)
        if commit:
            user.save()
        return user

我建议你使用简单的

class UserUpdateForm(forms.ModelForm):       
    class Meta:
        model = User
        # Add all the fields you want a user to change
        fields = ('first_name', 'last_name', 'username', 'email') 

对于密码更改,您可以使用另一个专用表单django.contrib.auth.forms.SetPasswordForm,因为更改密码与更新用户信息的过程不同

答案 1 :(得分:0)

您可以创建自己的密码表单字段并手动处理。或者您可以自己覆盖干净方法并删除与密码相关的错误。