Autenticación personalizada en Django con email en vez de username

Autenticación personalizada en Django con email en vez de username

En muchos sistemas modernos, el correo electrónico ha reemplazado al nombre de usuario tradicional como método de autenticación. Django, por defecto, utiliza el campo username, pero es completamente posible y recomendable modificar este comportamiento para utilizar email como identificador principal de los usuarios.

En este artículo aprenderás a:

  • Sobrescribir el modelo User

  • Configurar el sistema de autenticación para usar email

  • Crear un formulario de registro y login personalizado

  • Aplicar buenas prácticas en producción

¿Por qué usar el correo electrónico como login?

  • Más natural para los usuarios: todos recuerdan su correo, pero no siempre su nombre de usuario.

  • Evita duplicidad de emails: en muchas apps se termina exigiendo un email único además del username.

  • Facilita integraciones: como autenticación OAuth, notificaciones, recuperación de contraseña, etc.

Se da por entendido que ya sabes crear un entorno virtual, activar el entorno virtual y crear un proyecto en django.

Paso 1: Crear un modelo de usuario personalizado

Primero, crea una app para manejar usuarios (si aún no la tienes):


python manage.py startapp usuarios

En usuarios/models.py, crea un modelo que extienda AbstractBaseUser y PermissionsMixin:

En este paso , por buenas practicas y para mantener un codigo limpio y escalable, lo recomendable es crear dentro de tu aplicacion un archvo managers.py y dentro colocar el UsuarioManager

y luego lo llamas en el modelo.

# usuarios/models.py

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models
from django.utils import timezone

class UsuarioManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError("El email es obligatorio")
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        return self.create_user(email, password, **extra_fields)

class Usuario(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    nombre = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    date_joined = models.DateTimeField(default=timezone.now)

    objects = UsuarioManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["nombre"]

    def __str__(self):
        return self.email

 

Paso 2: Configurar el modelo en settings.py

En el archivo settings.py, indícale a Django que ahora usarás tu nuevo modelo:

AUTH_USER_MODEL = 'usuarios.Usuario'

Haz esto antes de ejecutar las migraciones iniciales del proyecto. Si cambias esto en un proyecto ya migrado, puede causar problemas.

Paso 3: Migraciones

Ejecuta las migraciones para registrar el nuevo modelo:

python manage.py makemigrations usuarios
python manage.py migrate

Paso 4: Formulario de autenticación (opcional, si usas vistas propias)

Crea un formulario para login usando el nuevo campo email:

# usuarios/forms.py

from django import forms
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import get_user_model

class LoginEmailForm(AuthenticationForm):
    username = forms.EmailField(label="Correo electrónico")

    class Meta:
        model = get_user_model()
        fields = ['username', 'password']

 

Paso 5: Vista y template de login personalizado

vista:

# usuarios/views.py

from django.contrib.auth.views import LoginView
from .forms import LoginEmailForm

class CustomLoginView(LoginView):
    template_name = 'usuarios/login.html'
    authentication_form = LoginEmailForm

URL:

# usuarios/urls.py

from django.urls import path
from .views import CustomLoginView

urlpatterns = [
    path('login/', CustomLoginView.as_view(), name='login'),
]

Y en tu urls.py general:

path('usuarios/', include('usuarios.urls')),

Template (usuarios/login.html):

<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Ingresar</button>
</form>

Paso 6: Crear superusuario con email

python manage.py createsuperuser

Se te pedirá un correo en lugar de nombre de usuario.

Buenas prácticas

  • Valida el formato del email siempre que crees usuarios desde formularios públicos.

  • Usa autenticación por tokens (JWT, DRF) si crearás APIs móviles.

  • Agrega autenticación en dos pasos (2FA) para mayor seguridad.

  • Activa el sistema de recuperación por correo desde Django

Conclusión

Modificar Django para usar el correo electrónico como método de login es totalmente viable, seguro y recomendable en aplicaciones modernas. Mejora la experiencia del usuario y evita redundancia en tus datos.