2011-09-23 38 views
7

Quiero que mi página de registro de usuario muestre el campo de correo electrónico y contraseña, y no nombre de usuario. He creado este Formulario de Registro: Pero todavía pareceCómo eliminar el campo de nombre de usuario de UserCreationForm en Django

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 

el nombre de usuario. ¿Debo anular algo más?

+0

Creo que el nombre de usuario proviene de 'UserCreationForm', por lo que' exclude' it desde allí! – Ahsan

Respuesta

0

añadir que el campo de excluir de la clase Meta:

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

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

Eso no ayudó realmente. así que probé diferentes variaciones de esa exclusión, pero no funcionó para mí. – ArmenB

5

Puede que salga el nombre de usuario de los campos del formulario, así:

class RegisterForm(UserCreationForm): 

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

Pero entonces tendría que rellenar algunos nombre de usuario al azar antes de guardar como por lo que:

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() 

Hay otras consideraciones a tener cuando entrar ilegalmente en él de esta manera, como asegurándose de que su LoginForm tiraría el nombre de usuario más adelante, cuando se necesita:

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

Lo sentimos, el LoginForm con el campo de correo electrónico primero mostrará la contraseña y luego el correo electrónico. Pon esto dentro de __init__ para arreglar eso: self.fields.keyOrder = ['email', 'password',] –

Cuestiones relacionadas