2011-09-23 63 views
7

我希望我的用户注册页面显示电子邮件和密码字段,并且没有用户名。 我已经创建了这个注册表格:如何从Django中的UserCreationForm中删除用户名字段

class RegisterForm(UserCreationForm): 
    email = forms.EmailField(label = "Email") 
    #fullname = forms.CharField(label = "First name") 

    class Meta: 
     model = User 
     fields = ("email",) 

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

但是用户名仍然出现。我需要重写其他内容吗?

+0

我认为username字段来自'UserCreationForm',所以从这里排除它! – Ahsan

回答

0

该字段添加到元类的排除:

class RegisterForm(UserCreationForm): 
    email = forms.EmailField(label = "Email") 
    #fullname = forms.CharField(label = "First name") 

    class Meta: 
     model = User 
     exclude = ['username',] 
+0

这确实没有帮助。所以我尝试了不同的排除方式,但它对我没有任何作用。 – ArmenB

5

可以弹出从表单字段的用户名,像这样:

class RegisterForm(UserCreationForm): 

    def __init__(self, *args, **kwargs): 
     super(RegisterForm, self).__init__(*args, **kwargs) 
     # remove username 
     self.fields.pop('username') 
    ... 

但那么你就需要保存像以前一样以填充一些随机用户名所以:

from random import choice 
from string import letters 
... 

class RegisterForm(UserCreationForm): 
... 
    def save(self): 
     random = ''.join([choice(letters) for i in xrange(30)]) 
     self.instance.username = random 
     return super(RegisterForm, self).save() 

还有其他方面的考虑,当你破解这种方式,像确保您的LoginForm的会拉的用户名采取以后在需要时:

class LoginForm(AuthenticationForm): 

    email = forms.EmailField(label=_("E-mail"), max_length=75) 

    def __init__(self, *args, **kwargs): 
     super(LoginForm, self).__init__(*args, **kwargs) 
     self.fields['email'].required = True 
     # remove username 
     self.fields.pop('username') 

    def clean(self): 
     user = User.objects.get(email=self.cleaned_data.get('email')) 
     self.cleaned_data['username'] = user.username 
     return super(LoginForm, self).clean() 
+1

抱歉,带有电子邮件字段的LoginForm将先显示密码,然后再显示电子邮件。把它放在__init__中以解决这个问题:self.fields.keyOrder = ['email','password',] –

相关问题