¿Cuál es la mejor manera de extender el modelo de usuario (incluido con la aplicación de autenticación de Django) con campos personalizados? Posiblemente también me gustaría usar el correo electrónico como nombre de usuario (para fines de autenticación).
Ya he visto algunas formas de hacerlo, pero no puedo decidir cuál es la mejor.
Respuestas:
La forma menos dolorosa y recomendada por Django de hacerlo es a través de una
OneToOneField(User)
propiedad.Dicho esto, extenderlo
django.contrib.auth.models.User
y suplantarlo también funciona ...Definitivamente, me mantendría alejado de cambiar la clase de usuario real en su árbol de origen de Django y / o copiar y alterar el módulo de autenticación.
fuente
user = models.ForeignKey(User, unique=True)
¿Es esto lo mismo queuser = models.OneToOneField(User)
? Creo que el efecto final es el mismo? Pero tal vez la implementación en el backend es diferente.Nota: esta respuesta está en desuso. vea otras respuestas si está utilizando Django 1.7 o posterior.
Así es como lo hago.
Esto creará un perfil de usuario cada vez que se guarde un usuario si se crea. Entonces puedes usar
Aquí hay más información de los documentos
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Actualización: tenga en cuenta que
AUTH_PROFILE_MODULE
está en desuso desde la v1.5: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-modulefuente
user = models.ForeignKey( User )
y recuperar el objeto de perfil a través deuser.get_profile()
. Recuerdefrom django.contrib.admin.models import User
.User
Bueno, pasó un tiempo desde 2008 y es hora de una nueva respuesta. Desde Django 1.5 podrás crear una clase de usuario personalizada. En realidad, en el momento en que escribo esto, ya está fusionado en master, por lo que puedes probarlo.
Hay cierta información al respecto en documentos o si desea profundizar en él, en este compromiso .
Todo lo que tiene que hacer es agregar
AUTH_USER_MODEL
a la configuración con la ruta a la clase de usuario personalizada, que se extiendeAbstractBaseUser
(versión más personalizable) oAbstractUser
(clase de usuario más o menos antigua que puede extender).Para las personas que son perezosas para hacer clic, aquí hay un ejemplo de código (tomado de documentos ):
fuente
email
es el nombre de usuario.unique=True
al campo de correo electrónico para dejar deUSERNAME_FIELD
aceptarloDesde Django 1.5, puede ampliar fácilmente el modelo de usuario y mantener una sola tabla en la base de datos.
También debe configurarlo como clase de usuario actual en su archivo de configuración
Si desea agregar muchas preferencias de usuarios, la opción OneToOneField puede ser una mejor opción.
Una nota para las personas que desarrollan bibliotecas de terceros: si necesita acceder a la clase de usuario, recuerde que las personas pueden cambiarla. Usa el ayudante oficial para obtener la clase correcta
fuente
django_social_auth
, le recomiendo usar una relación OneToOne. NO use este método o arruinará sus migraciones.django_social_auth
complemento y definir AUTH_USER_MODEL para el usuario de autenticación social. Luego, cuando ejecuté manage.py migrate, estropeó mi aplicación. Cuando, en cambio, utilicé el modelo de usuario de autenticación social como una relación OneToOne descrita aquí: stackoverflow.com/q/10638293/977116Changing this setting after you have tables created is not supported by makemigrations and will result in you having to manually write a set of migrations to fix your schema
Fuente: docs.djangoproject.com/en/dev/topics/auth/customizing/…Hay una recomendación oficial sobre el almacenamiento de información adicional sobre los usuarios . El libro de Django también trata este problema en la sección Perfiles .
fuente
El siguiente es otro enfoque para extender un usuario. Siento que es más claro, fácil, legible que por encima de dos enfoques.
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
Usando el enfoque anterior:
fuente
Simplemente puede ampliar el perfil de usuario creando una nueva entrada cada vez que se crea un usuario utilizando las señales de guardado de Django
modelos.py
Esto creará automáticamente una instancia de empleado cuando se cree un nuevo usuario.
Si desea ampliar el modelo de usuario y desea agregar más información al crear un usuario, puede usar django-betterforms ( http://django-betterforms.readthedocs.io/en/latest/multiform.html ). Esto creará un formulario para agregar usuarios con todos los campos definidos en el modelo de perfil de usuario.
modelos.py
formas.py
views.py
addUser.html
urls.py
fuente
Extender el modelo de usuario de Django (UserProfile) como un profesional
Esto me ha resultado muy útil: enlace
Un extracto:
desde django.contrib.auth.models import User
fuente
Nuevo en Django 1.5, ahora puede crear su propio modelo de usuario personalizado (que parece ser algo bueno en el caso anterior). Consulte 'Personalización de autenticación en Django'
Probablemente la nueva característica más genial en la versión 1.5.
fuente
Esto es lo que hago y es, en mi opinión, la forma más sencilla de hacerlo. defina un administrador de objetos para su nuevo modelo personalizado y luego defina su modelo.
No olvide agregar esta línea de código en su
settings.py
:Esto es lo que hago y siempre funciona.
fuente
Actualmente, a partir de Django 2.2, la forma recomendada al comenzar un nuevo proyecto es crear un modelo de usuario personalizado que herede de AbstractUser, luego apunte AUTH_USER_MODEL al modelo.
Fuente: https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
fuente
Enfoque simple y efectivo es models.py
fuente