usuarios usuario template permisos modelo grupos extendido extender agregar django django-models django-1.5

usuario - permisos en template django



El uso del correo electrónico como campo de nombre de usuario en Django 1.5 personalizado El modelo de usuario resulta en FieldError (4)

Ian, muchas gracias por la respuesta inteligente :)

Sin embargo, ya he "parcheado" una solución.

Dado que AbstractUser también tiene un campo de username que es totalmente innecesario para mí
Decidí crear mi "propio" AbstractUser .

Al crear subclases entre AbstractBaseUser y PermissionsMixin , conservo la mayoría de los métodos integrados del modelo de usuario sin agregar ningún código.

También aproveché esa oportunidad para crear un Manager personalizado para eliminar el uso en el campo de username de username todos juntos:

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager class CustomUser(AbstractBaseUser, PermissionsMixin): .... email = models.EmailField(max_length=255, unique=True) first_name = ... last_name = ... is_active = ... is_staff = ... .... objects = CustomUserManager() USERNAME_FIELD = ''email'' class CustomUserManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): ..... def create_superuser(self, email, password, **extra_fields): .....

Esta solución da como resultado la repetición de algunos de los códigos integrados de Django (principalmente los campos de modelos que ya existen en AbstractUser como ''first_name'', ''last_name'', etc.), pero también en un objeto User más limpio y una tabla de base de datos.

Es una verdadera lástima que la flexibilidad presentada en 1.5 con USERNAME_FIELD no se pueda usar para crear un modelo de usuario flexible bajo todas las restricciones existentes.

EDITAR: Hay un ejemplo completo trabajado disponible en los documentos oficiales: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#a-full-example

Quiero usar un campo de correo electrónico como el campo de nombre de usuario para mi modelo de usuario personalizado. Tengo el siguiente modelo de usuario personalizado subclasificando el modelo AbstractUser de Django:

class CustomUser(AbstractUser): .... email = models.EmailField(max_length=255, unique=True) USERNAME_FIELD = ''email''

Pero cuando corro

python manage.py sql myapp

Obtuve el siguiente error:

FieldError: el campo local ''email'' en la clase ''CustomUser'' choca con el campo de nombre similar de la clase base ''AbstractUser''

La razón por la que incluyo mi propio campo de correo electrónico en primer lugar es agregarle la opción unique=True . de lo contrario, obtengo:

myapp.customuser: el USERNAME_FIELD debe ser único. Agregue unique = True a los parámetros de campo.

Ahora, con respecto a esto: https://docs.djangoproject.com/en/1.5/topics/db/models/#field-name-hiding-is-not-permitted
¿Cómo puedo lograr esto? (otros luego nombrar el campo "user_email" o algo así)


Puede editar su CustomUser para cambiar el atributo de campo de email a unique=True .

Añádalo al final de su clase de usuario personalizada de la siguiente manera:

class CustomUser(AbstractUser): ... USERNAME_FIELD = ''email'' ... CustomUser._meta.get_field_by_name(''email'')[0]._unique=True

Tenga en cuenta que estamos cambiando _unique y no es unique porque este último es un @property simple.

Esto es un truco, y me encantaría escuchar cualquier respuesta "oficial" para resolver esto.


Si su objetivo real son valores únicos de "correo electrónico" e ignorando los valores de "nombre de usuario", entonces puede:

  • Rellene el "nombre de usuario" con, por ejemplo, sha256(user.email).hexdigest()[:30]
  • Agregue unicidad de esta manera:

    class User(AbstractUser): class Meta: unique_together = (''email'', )

Esto resulta en:

CREATE TABLE "myapp_user" ( ... "email" varchar(75) NOT NULL, UNIQUE ("email") )

funciona como se esperaba, y es bastante simple.


Use el ejemplo del sitio oficial:

https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#a-full-example

Aquí hay un ejemplo de una aplicación de usuario personalizada y compatible con el administrador. Este modelo de usuario usa una dirección de correo electrónico como nombre de usuario y tiene una fecha de nacimiento requerida; no proporciona verificación de permisos, más allá de un simple indicador de administración en la cuenta de usuario. Este modelo sería compatible con todas las formas y vistas de autenticación incorporadas, a excepción de los formularios de creación de usuarios. Este ejemplo ilustra cómo la mayoría de los componentes funcionan juntos, pero no está destinado a ser copiado directamente en proyectos para uso de producción.