es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo cambiar el campo de nombre de usuario a user_name en el modelo de usuario personalizado de Django?

He creado un modelo de usuario personalizado. Ahora quiero usar “user_name” como campo de nombre de usuario en lugar de “username”, como se muestra en el fragmento de código siguiente.

class CustomUser(AbstractBaseUser):

    username_validator = UnicodeUsernameValidator()

    user_name = models.CharField(
        _('username'),
        max_length=100,
        unique=True,
        help_text=_('Required. 100 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    USERNAME_FIELD = 'user_name'

No puedo hacer eso. Estoy obteniendo el siguiente error:

SystemCheckError: System check identified some issues:
ERRORS:
<class 'accounts.admin.customuseradmin'="">: (admin.E033) The value of 'ordering[0]' refers to 'username', which is not an attribute of 'accounts.CustomUser'.
<class 'accounts.admin.customuseradmin'="">: (admin.E108) The value of 'list_display[0]' refers to 'username', which is not a callable, an attribute of 'CustomUserAdmin', or an attribute or method on 'accounts.CustomUser'

La razón por la que quiero hacer esto es porque todas las tablas de la base de datos del proyecto siguen esta convención. Sería mejor si pudiera definir el nombre del campo en la base de datos de la misma manera que lo hacemos con las tablas en la clase Meta, como se muestra a continuación, donde llamo a mi modelo CustomUser como modelo de usuario en la base de datos.

class Meta:
        db_table = "user"

¿Hay alguna manera de llamar al campo de la tabla de esta manera?

class Meta:
            db_table_user_name = "username"

Si es posible, no necesitaremos cambiar “username” a “user_name”. Podremos llamar directamente al campo de nombre de usuario como “user_name” en la base de datos, si y solo si es posible con los modelos de Django.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para usar user_name como campo de nombre de usuario en lugar de username en el modelo de usuario personalizado de Django, debes definir el atributo USERNAME_FIELD en tu modelo como user_name, como se muestra en el fragmento de código mencionado:

    class CustomUser(AbstractBaseUser):
    
        username_validator = UnicodeUsernameValidator()
    
        user_name = models.CharField(
            _('username'),
            max_length=100,
            unique=True,
            help_text=_('Required. 100 characters or fewer. Letters, digits and @/./+/-/_ only.'),
            validators=[username_validator],
            error_messages={
                'unique': _("A user with that username already exists."),
            },
        )
    
        USERNAME_FIELD = 'user_name'
    

    Sin embargo, el problema que estás enfrentando no está relacionado con la definición de USERNAME_FIELD, sino que se debe al uso del campo username en los atributos list_display y ordering de la clase CustomUserAdmin, que es la clase de administración para el modelo CustomUser.

    Para solucionar este problema, debes reemplazar el campo username por user_name en los atributos list_display y ordering de la clase CustomUserAdmin, como se muestra a continuación:

    class CustomUserAdmin(admin.ModelAdmin):
        list_display = ['user_name', 'email', 'first_name', 'last_name', 'is_active', 'is_staff', 'is_superuser']
        ordering = ['user_name']
    

    Con respecto a tu segunda pregunta, no hay una forma directa de definir el nombre del campo de la base de datos para un campo de modelo en los modelos de Django. Sin embargo, puedes definir un nombre de db_table personalizado para tu modelo en la clase Meta, lo que cambiará el nombre de la tabla para tu modelo en la base de datos.

    Entonces, si deseas cambiar el nombre de la tabla para tu modelo CustomUser a user en la base de datos, puedes definir el atributo db_table en la clase Meta como se muestra a continuación:

    class CustomUser(AbstractBaseUser):
    
        # ...
    
        class Meta:
            db_table = "user"
    

    Esto creará la tabla user en la base de datos para tu modelo CustomUser. Sin embargo, esto no cambiará el nombre del campo username a user_name en la tabla user. Para hacer eso, debes definir tus campos de modelo en consecuencia.

Comments are closed.