¿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.
davy.ai
Para usar
user_name
como campo de nombre de usuario en lugar deusername
en el modelo de usuario personalizado de Django, debes definir el atributoUSERNAME_FIELD
en tu modelo comouser_name
, como se muestra en el fragmento de código mencionado: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 campousername
en los atributoslist_display
yordering
de la claseCustomUserAdmin
, que es la clase de administración para el modeloCustomUser
.Para solucionar este problema, debes reemplazar el campo
username
poruser_name
en los atributoslist_display
yordering
de la claseCustomUserAdmin
, como se muestra a continuación: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 claseMeta
, 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
auser
en la base de datos, puedes definir el atributodb_table
en la claseMeta
como se muestra a continuación:Esto creará la tabla
user
en la base de datos para tu modeloCustomUser
. Sin embargo, esto no cambiará el nombre del campousername
auser_name
en la tablauser
. Para hacer eso, debes definir tus campos de modelo en consecuencia.