扩展UserCreationForm时排除密码

时间:2012-06-09 07:40:13

标签: django

我想创建一个视图,用户可以在其中更改其User对象的属性:first_name,last_name和email address。 Django有一个内置的UserCreationForm用于创建用户。我已经有一个扩展版本,其中还包括email,first_name和last_name。现在我试图将那个扩展到包括密码和用户名。

from django.contrib.auth.forms import UserCreationForm
class ExtendedUserCreationForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'password1', 'password2', 
                  'email', "first_name", 'last_name' )

class UserEditForm(ExtendedUserCreationForm):
    class Meta:
        model = User
        exclude = ('username', 'password1', 'password2')

我正在寻找的UserEditForm当然不能创建新实例,但它只会用于编辑现有实例:

form = UserEditForm(instance=request.user)

但是,仍会显示用户名字段和密码字段。我该如何排除这些?

4 个答案:

答案 0 :(得分:3)

您可以删除表单初始化中的password2字段,如下所示:

class MyUserCreationForm(UserCreationForm):

    def __init__(self, *args, **kargs):
        super(MyUserCreationForm, self).__init__(*args, **kargs)
        del self.fields['password2']

答案 1 :(得分:1)

have a look at a class你的子类并不是一个坏主意。 password1password2字段是直接在表单中定义的,而不是在模型中定义的。因此excludefields对他们没有任何影响。只需按照@MatthewSchinckel的建议制作自己的ModelForm

答案 2 :(得分:1)

认为这会产生这个想法......

class RegistrationForm(UserCreationForm):
    email = forms.EmailField(required=True)
    #first_name = forms.CharField(required=True)
    #last_name = forms.CharField(required=True)
    username = forms.CharField (required=True)

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

def __init__ (self, *args, **kwargs):
    super(RegistrationForm,self).__init__(*args, **kwargs)
    #remove what you like...
    self.fields.pop ('first_name')
    self.fields.pop ('last_name')
    self.fields.pop ('password1')
    self.fields.pop ('password2')

答案 3 :(得分:0)

为什么不使用ModelForm,并排除您不想要的字段?这似乎是一个更简单的解决方案。