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.