我想创建一个视图,用户可以在其中更改其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)
但是,仍会显示用户名字段和密码字段。我该如何排除这些?
答案 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你的子类并不是一个坏主意。 password1
和password2
字段是直接在表单中定义的,而不是在模型中定义的。因此exclude
和fields
对他们没有任何影响。只需按照@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
,并排除您不想要的字段?这似乎是一个更简单的解决方案。