10

编辑以包含代码

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,但更新其他配置文件字段不是必需的。

问题是当passwordandpassword confirmation字段为空白时,我的验证正在启动。

我认为User模型字段是一个和字段,因此我需要一种在验证此模型时简单地忽略表单中的空白输入的方法。Passwordrequired=Trueblank=False

User模型是 Django 附带的模型:

from django.contrib.auth.models import User

谢谢

4

2 回答 2

14

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因为更改密码与更新用户信息的过程不同

于 2012-12-18T15:11:44.600 回答
0

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

于 2012-12-18T15:05:11.617 回答