2011-09-23 14 views
7

Desidero che la mia pagina di registrazione utente visualizzi il campo email e password e nessun nome utente. Ho creato questo modulo di registrazione: Come rimuovere il campo Nome utente da UserCreationForm in 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 

ma appare ancora

il nome utente. Devo ignorare qualcos'altro?

+0

Penso che il campo nome utente provenga da 'UserCreationForm', quindi 'escludilo' da lì! – Ahsan

risposta

0

Aggiungi che campo alla classe Meta esclude:

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

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

Questo non ha aiutato davvero. quindi ho provato diverse varianti di quella esclusione ma non ha funzionato per me. – ArmenB

5

Si può saltar fuori il nome utente dai campi del form in questo modo:

class RegisterForm(UserCreationForm): 

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

Ma allora si avrebbe bisogno di riempire in qualche nome utente casuale prima di salvare come così:

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

ci sono altre considerazioni da prendere quando si incidere in questo modo, come rendere sicuro il vostro LoginForm tirava il nome utente in seguito, quando è necessario:

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

Siamo spiacenti, il LoginForm con il campo email mostrerà prima la password e poi l'email. Metti questo in __init__ per risolvere il problema: self.fields.keyOrder = ['email', 'password',] –

Problemi correlati