2

我想创建一个视图,用户可以在其中更改他的用户对象的属性:名字、姓氏和电子邮件地址。Django 有一个内置的 UserCreationForm 用于创建用户。我已经有一个扩展版本,其中还包括电子邮件、名字和姓氏。现在我正在尝试将其扩展为包括密码和用户名。

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

4 回答 4

5

您可以像这样删除表单初始化中的 password2 字段:

class MyUserCreationForm(UserCreationForm):

    def __init__(self, *args, **kargs):
        super(MyUserCreationForm, self).__init__(*args, **kargs)
        del self.fields['password2']
于 2016-09-23T11:27:11.043 回答
1

看看你的子类不是一个坏主意。password1password2字段直接在表单中定义,而不是在模型中。所以exclude并且fields不会对他们产生影响。ModelForm按照@MatthewSchinckel 的建议,自己制作。

于 2012-06-09T07:49:09.037 回答
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')
于 2015-09-29T15:33:35.783 回答
0

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

于 2012-06-09T07:44:31.037 回答