How to remove Username field from UserCreationForm in Django

I want the email and password field to be displayed on my user registration page, not the username. I created this registration form:

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 

But the username still appears. Do I need to redefine something else?

+7
source share
3 answers

You can display the username from the form fields as follows:

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

But then you will need to fill in some random username before saving like this:

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

There are other considerations to take when you hack it in such a way as to make sure your LoginForm pulls out the username later when necessary:

 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() 
+5
source

Found. This is exactly what I wanted to do: http://www.micahcarrick.com/django-email-authentication.html

+1
source

Add this field to the Meta class:

 class RegisterForm(UserCreationForm): email = forms.EmailField(label = "Email") #fullname = forms.CharField(label = "First name") class Meta: model = User exclude = ['username',] 
0
source

All Articles