django django-models django-users django-1.6 django-1.7

Usuario más largo en Django 1.7



django-models django-users (3)

Quiero aumentar la longitud del nombre de usuario en django de 30 a alrededor de 80, sé que puede ser una pregunta duplicada pero las respuestas anteriores no funcionan, por ejemplo, https://kfalck.net/2010/12/30/longer- nombres de usuario-para-django

esto es para Django 1.2.

¿Alguien ha intentado hack similar para Django> 1.5 Gracias de antemano


En Django 1.5 y superior, el enfoque recomendado sería crear un modelo de usuario personalizado . Luego puede hacer que el campo de nombre de usuario sea exactamente como lo desea.


Tuve el mismo problema hace unos días. Finalmente, terminé simplemente cortando los primeros 30 caracteres del nombre de usuario (antiguo) (en la nueva tabla de la base de datos) y agregando un backend de autenticación personalizado que verificará el correo electrónico en lugar del nombre de usuario. Terrible hackeo, lo sé, y planeo solucionarlo tan pronto como tenga algo de tiempo. La idea es siguiente:

Ya tengo una clase de modelo que tiene una relación uno-a-uno con djangos auth.User. Agregaré otro campo llamado full_username .

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

Luego, agregaré otro backend de autenticación personalizado que marcará este campo como nombre de usuario. Se vería algo como esto:

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)

Después de esto, debe cambiar settings.py:

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

Espero que funcione


Los modelos de usuario personalizados son un gran cambio y no siempre son compatibles con las aplicaciones. Lo resolví ejecutando esta migración muy pragmática. Tenga en cuenta que esto solo lo resuelve en el nivel de la base de datos.

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