Usando el modelo de usuario personalizado de Django (Django1.6)

Tengo una aplicación de Django que necesita un campo adicional (una asignación de manytomany a una clase de libro) y lo hice ampliando el AbstractUser.

Si está completamente satisfecho con el modelo de usuario de Django y solo desea agregar información de perfil adicional, puede simplemente subclase django.contrib.auth.models.AbstractUser y agregar sus campos de perfil personalizados. Esta clase proporciona la implementación completa del usuario predeterminado como modelo abstracto.

class User(AbstractUser):
    entitledBooks = models.ManyToManyField(Book)

I added the model in my settings.py

AUTH_USER_MODEL = 'BookRServer.User'

¿Pero cómo creo un usuario (programáticamente)?

user = User.objects.create_user() no funciona.

0
¿A qué te refieres con "no funciona"? Stack trace, por favor? Además, ¿está importando usuarios de sus modelos? Creo que la forma sugerida por Django es utilizar User = get_user_model() en su lugar.
agregado el autor Kimvais, fuente
Argh ... Debería haber sido más elocuente. Puedo "crear" un usuario, pero no puedo agregar un "libro" a "libros titulados". Dice "el usuario del objeto no tiene ningún atributo titulado Books". Solo puedo suponer que está creando el Usuario original y no mi Usuario personalizado.
agregado el autor user1349663, fuente

2 Respuestas

En la forma más simple posible, poco compacta es crear un modelo de perfil de usuario de relación uno a uno que contenga su relación de muchos a muchos

class UserProfile(models.Model):
    user = model.OneToOneField(User)
    # your many-to-many field here


# create user
u = User(username="", password="", email="", ...)
u.save()
u.userprofile(your fields..here)
u.userprofile.save()

Esto es típicamente el mismo en todas las versiones de django. Lo que básicamente django 1.6 está en desuso es proporcionar un método de modelo get_profile y algunas configuraciones relevantes.

A menos que realmente desee construir el modelo User directamente desde el suelo según los requisitos, no es necesario que realmente use AUTH_USER_MODEL .

Separar el perfil de usuario del modelo de usuario también ayuda a largo plazo

0
agregado
Ah. Gracias por informarme sobre AUTH_USER_MODEL. Pero dado que se proporciona AbstractUser, me gustaría saber cómo usarlo.
agregado el autor user1349663, fuente
Sí, lo entendí. Pero ahora que no estoy usando AbstractBaseUser, sino AbstractUser, no necesito construir desde cero. Y, sin embargo, la creación de usuarios en el método habitual crea el usuario predeterminado en lugar del personalizado.
agregado el autor user1349663, fuente
consulte los documentos de django, eso se explica mejor allí.
agregado el autor Surya, fuente
El uso de AUTH_USER_MODEL supone que estás construyendo todo por tu cuenta desde el principio y nada más. Hay algunas pequeñas medidas de seguridad de las que se ocupan estas clases. Echa un vistazo a ese código cuando estés construyendo desde rasguño
agregado el autor Surya, fuente

El método de administrador create_user solo acepta tres argumentos, nombre de usuario, correo electrónico (opcional) y contraseña (opcional).

Puedes hacerlo:

bookset=Book.objects.all()
user = User.objects.create_user('testuser',email='[email protected]')
user.entitledBooks=bookset
user.save()
0
agregado
Usé user.entitledBooks.add, pero sí, tuve que crear el objeto de usuario y luego agregarle los campos adicionales. Entonces, aceptaré esta respuesta.
agregado el autor user1349663, fuente