Saltar al contenido

Hacer que el correo electrónico de usuario sea único django

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:

  1. Copia de seguridad de su base de datos
  2. 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)
  3. Eliminar todos los archivos de migraciones (excepto __init__.py)
  4. Eliminar todas las entradas de la tabla django_migrations
  5. Cree todos los archivos de migraciones usando python manage.py makemigrations
  6. Ejecute migraciones falsas por python manage.py migrate --fake
  7. 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)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *