Django Registration Redux: how to change the unique identifier from username to email and use email as login

后端 未结 3 1970
故里飘歌
故里飘歌 2020-12-19 20:21

I\'m using django-registration-redux in my project for user registration. It uses default User model which use username as the unique

相关标签:
3条回答
  • 2020-12-19 21:07

    You will want to use AbstractBaseUser. Docs are here:

    https://docs.djangoproject.com/en/1.8/topics/auth/customizing/

    Good luck!

    0 讨论(0)
  • 2020-12-19 21:12

    The easiest way to achieve this is to made your own custom User Model.

    This is the example

    class MyUser(AbstractBaseUser):
        email = models.EmailField(
            verbose_name='email address',
            max_length=255,
            unique=True,
        )
        date_of_birth = models.DateField()
        is_active = models.BooleanField(default=True)
        is_admin = models.BooleanField(default=False)
    
        objects = MyUserManager()
    
        USERNAME_FIELD = 'email' 
    

    Then, you need to set the User Model in your Django settings. https://docs.djangoproject.com/en/1.8/ref/settings/#auth-user-model

    0 讨论(0)
  • 2020-12-19 21:20

    You can override registration form like this

    from registration.forms import RegistrationForm
    class MyRegForm(RegistrationForm):
        username = forms.CharField(max_length=254, required=False, widget=forms.HiddenInput())
    
        def clean_email(self):
            email = self.cleaned_data['email']
            self.cleaned_data['username'] = email
            return email
    

    And then add this to settings file (read this link for details)

    REGISTRATION_FORM = 'app.forms.MyRegForm'
    

    This will set the email to username field as well and then everything will work as email is now the username.

    The only problem is that username field has a max lenght of 30 in DB. So emails longer than 30 chars will raise DB exception. To solve that override the user model (read this for details).

    0 讨论(0)
提交回复
热议问题