5

I want to increase the length of the username in django from 30 to around 80, I know it may be duplicate question but the previous answers are not working, for example https://kfalck.net/2010/12/30/longer-usernames-for-django

this is for Django 1.2.

Did anyone try similar hack for Django>1.5 Thanks in advance

vaibhav1312
  • 863
  • 4
  • 13
  • 31

3 Answers3

0

In Django 1.5 and above, the recommended approach would be to create a custom user model. Then you can make the username field exactly as you want.

Alasdair
  • 298,606
  • 55
  • 578
  • 516
0

I had the same problem few days ago. Finally, I ended just with cutting off first 30 characters of the (old) username (into the new database table), and adding a custom authentication backend that will check the email instead of user name. Terrible hack I know, and I'm planning to fix it as soon as I have some time. The idea is following:

I already have a model class that has one-to-one relation with djangos auth.User. I will add another field there called full_username.

class MyCustomUserModel(models.Model):
    user = models.OneToOneField(
            settings.AUTH_USER_MODEL, related_name="custom_user")
    full_username = models.CharField(max_length=80, ...)
    ...

Then, I'll add another custom authentication backend that will check this field as username. It would look something like this:

from django.contrib.auth.backends import ModelBackend

class FullUsernameAuthBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        if username is None:
            username = kwargs.get(UserModel.USERNAME_FIELD)

        try:
            user = UserModel._default_manager.filter(custom_user__full_username=username)
            # If this doesn't work, will use (the second case):
            # user = MyCustomUserModel.objects.filter(full_username=username).user
        if user.check_password(password):
            return user
    except UserModel.DoesNotExist:
        # Adding exception MyCustomUserModel.DoesNotExist in "(the second case)"
        # Run the default password hasher once to reduce the timing
        # difference between an existing and a non-existing user (#20760).
        UserModel().set_password(password)

After this, you need to change settings.py:

AUTHENTICATION_BACKENDS = (
    "....FullUsernameAuthBackend",
    # I will have the email auth backend here also.
)

I hope that it will work.

  • Note `AUTHENTICATION_BACKENDS = (`, so the original django's auth backend shouldn't be used (and auth.User.username should be disregarded on login in this case). – Kristijan Mitrovic Oct 16 '14 at 09:41
  • Actually I was taking email from user as username and storing it in both username field and email field, and was using default authentication system. Thanks for your answer. – vaibhav1312 Oct 16 '14 at 11:30
0

Custom User Models are a huge change to make and aren't always compatible with apps. I solved it by running this very pragmatic migration. Note this only solves it at the database level.

migrations.RunSQL("alter table auth_user alter column username type varchar(254);")

Bufke
  • 3,195
  • 3
  • 28
  • 28