Solución:
La mejor respuesta es usar CustomUser
subclasificando el AbstractUser
y ponga allí la dirección de correo electrónico única. Por ejemplo:
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
email = models.EmailField(unique=True)
y actualice la configuración con AUTH_USER_MODEL="app.CustomUser"
.
Pero si no es necesario que almacene el correo electrónico único en la base de datos o tal vez no lo use como campo de nombre de usuario, puede actualizar el formulario clean
método para poner una validación. Por ejemplo:
class YourForm(UserCreationForm):
def clean(self):
email = self.cleaned_data.get('email')
if User.objects.filter(email=email).exists():
raise ValidationError("Email exists")
return self.cleaned_data
Actualizar
Si se encuentra en la mitad del proyecto, puede seguir la documentación sobre cómo cambiar la migración, en resumen, que es:
- Copia de seguridad de su base de datos
- Cree un modelo de usuario personalizado idéntico a auth.User, llámelo Usuario (las tablas de muchas a muchas mantienen el mismo nombre) y establezca db_table = “auth_user” (para que use la misma tabla)
- Eliminar todos los archivos de migraciones (excepto
__init__.py
) - Eliminar todas las entradas de la tabla
django_migrations
- Cree todos los archivos de migraciones usando
python manage.py makemigrations
- Ejecute migraciones falsas por
python manage.py migrate --fake
- Desarmado
db_table
, realice otros cambios en el modelo personalizado, genere migraciones, aplíquelas
Pero si recién está comenzando, elimine la base de datos y los archivos de migraciones en el directorio de migración, excepto __init__.py
. Luego cree una nueva base de datos, cree un nuevo conjunto de migraciones por python manage.py makemigrations
y aplicar migraciones por python manage.py migrate
.
Y para referencias en otros modelos, puede consultarlos en settings.AUTH_USER_MODEL
para evitar problemas futuros. Por ejemplo:
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
Hará referencia automáticamente al modelo de usuario actual.
Aquí hay un código de trabajo
Utilice los siguientes fragmentos de código en cualquiera de sus modelos.py
modelos.py
from django.contrib.auth.models import User
User._meta.get_field('email')._unique = True
versión de django: 3.0.2
Referencia: Django auth.user con correo electrónico único
Hay un gran ejemplo de esto en los documentos de Django: https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#a-full-example.
Tienes que declarar el campo de correo electrónico en tu AbstractBaseUser
modelo como unique=True
.
class MyUser(AbstractBaseUser):
email = models.EmailField(
verbose_name="email address",
max_length=255,
unique=True,
)
date_of_birth = models.DateField()
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)