Mi perfil implementado, con cambio de contraseña

This commit is contained in:
adrigongv23 2026-06-23 12:41:21 +02:00
parent a6306c5218
commit 0860c191f2
5 changed files with 181 additions and 6 deletions

View file

@ -19,10 +19,12 @@ from django.contrib import admin
from django.urls import path
from django.contrib.auth import views as auth_views
from gestion import views
from users import views as users_views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.inicio, name='inicio'),
path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(next_page='login'), name='logout'),
path('mi-perfil/', users_views.mi_perfil, name='mi_perfil'),
]

View file

@ -19,7 +19,7 @@
<nav class="navbar navbar-expand-xl navbar-dark bg-dark sticky-top shadow-sm">
<div class="container-fluid px-4">
<a class="navbar-brand d-flex align-items-center" href="#">
<a class="navbar-brand d-flex align-items-center" href="{% url 'inicio' %}">
<img src="{% static 'images/logo_gades.png' %}" alt="Logo Gades" height="40" class="me-2">
</a>
@ -81,7 +81,7 @@
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userDropdown">
<li><span class="dropdown-item-text fw-bold text-muted">Hola, {{ user.first_name }}</span></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Mi Perfil</a></li>
<li><a class="dropdown-item" href="{% url 'mi_perfil' %}">Mi Perfil</a></li>
<li>
<form method="post" action="{% url 'logout' %}">
{% csrf_token %}

View file

@ -0,0 +1,121 @@
{% extends 'base.html' %}
{% load static %}
{% block title %}Mi Perfil | Gades Manager{% endblock title %}
{% block content %}
<div class="row mb-3 flex-shrink-0">
<div class="col-12">
<div class="bg-dark text-white p-3 rounded-3 shadow-sm" style="border-left: 5px solid #0d6efd;">
<h1 class="display-6 fw-bold mb-1">Mi Perfil</h1>
<p class="text-white-50 mb-0">Consulta y edita tus datos personales.</p>
</div>
</div>
</div>
<div class="row g-4" style="overflow-y: auto;">
{% if messages %}
<div class="col-12">
{% for message in messages %}
<div class="alert alert-success py-2 small mb-0">{{ message }}</div>
{% endfor %}
</div>
{% endif %}
<div class="col-12 col-lg-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body p-4">
<h5 class="card-title fw-bold mb-3">Datos Personales</h5>
<div class="row g-2 mb-3">
<div class="col-6">
<label class="form-label small text-secondary mb-1">Rol en el equipo</label>
<input type="text" class="form-control" value="{{ user.get_rol_display }}" disabled>
</div>
<div class="col-6">
<label class="form-label small text-secondary mb-1">Área técnica</label>
<input type="text" class="form-control" value="{{ user.get_especialidad_display|default:'—' }}" disabled>
</div>
</div>
<form method="post">
{% csrf_token %}
<div class="mb-3">
<label for="{{ perfil_form.username.id_for_label }}" class="form-label fw-semibold">{{ perfil_form.username.label }}</label>
{{ perfil_form.username }}
{% for error in perfil_form.username.errors %}
<div class="text-danger small mt-1">{{ error }}</div>
{% endfor %}
</div>
<div class="row g-2">
<div class="col-6 mb-3">
<label for="{{ perfil_form.first_name.id_for_label }}" class="form-label fw-semibold">{{ perfil_form.first_name.label }}</label>
{{ perfil_form.first_name }}
</div>
<div class="col-6 mb-3">
<label for="{{ perfil_form.last_name.id_for_label }}" class="form-label fw-semibold">{{ perfil_form.last_name.label }}</label>
{{ perfil_form.last_name }}
</div>
</div>
<div class="mb-3">
<label for="{{ perfil_form.email.id_for_label }}" class="form-label fw-semibold">{{ perfil_form.email.label }}</label>
{{ perfil_form.email }}
{% for error in perfil_form.email.errors %}
<div class="text-danger small mt-1">{{ error }}</div>
{% endfor %}
</div>
<button type="submit" name="guardar_perfil" class="btn btn-primary fw-bold px-4">Guardar Cambios</button>
</form>
</div>
</div>
</div>
<div class="col-12 col-lg-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body p-4">
<h5 class="card-title fw-bold mb-3">Cambiar Contraseña</h5>
<form method="post">
{% csrf_token %}
<div class="mb-3">
<label for="{{ password_form.old_password.id_for_label }}" class="form-label fw-semibold">Contraseña actual</label>
<input type="password" name="{{ password_form.old_password.html_name }}" id="{{ password_form.old_password.id_for_label }}" class="form-control">
{% for error in password_form.old_password.errors %}
<div class="text-danger small mt-1">{{ error }}</div>
{% endfor %}
</div>
<div class="mb-3">
<label for="{{ password_form.new_password1.id_for_label }}" class="form-label fw-semibold">Nueva contraseña</label>
<input type="password" name="{{ password_form.new_password1.html_name }}" id="{{ password_form.new_password1.id_for_label }}" class="form-control">
{% for error in password_form.new_password1.errors %}
<div class="text-danger small mt-1">{{ error }}</div>
{% endfor %}
</div>
<div class="mb-3">
<label for="{{ password_form.new_password2.id_for_label }}" class="form-label fw-semibold">Confirmar nueva contraseña</label>
<input type="password" name="{{ password_form.new_password2.html_name }}" id="{{ password_form.new_password2.id_for_label }}" class="form-control">
{% for error in password_form.new_password2.errors %}
<div class="text-danger small mt-1">{{ error }}</div>
{% endfor %}
</div>
{% if password_form.non_field_errors %}
<div class="text-danger small mb-3">{{ password_form.non_field_errors }}</div>
{% endif %}
<button type="submit" name="cambiar_password" class="btn btn-outline-danger fw-bold px-4">Cambiar Contraseña</button>
</form>
</div>
</div>
</div>
</div>
{% endblock content %}

View file

@ -0,0 +1,20 @@
from django import forms
from .models import CustomUser
class PerfilForm(forms.ModelForm):
class Meta:
model = CustomUser
fields = ['username', 'first_name', 'last_name', 'email']
widgets = {
'username': forms.TextInput(attrs={'class': 'form-control'}),
'first_name': forms.TextInput(attrs={'class': 'form-control'}),
'last_name': forms.TextInput(attrs={'class': 'form-control'}),
'email': forms.EmailInput(attrs={'class': 'form-control'}),
}
labels = {
'username': 'Usuario',
'first_name': 'Nombre',
'last_name': 'Apellidos',
'email': 'Correo electrónico',
}

View file

@ -1,7 +1,39 @@
from django.shortcuts import render
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.contrib import messages
from .forms import PerfilForm
@login_required # Esto obliga a que el usuario tenga que loguearse antes de ver la web
@login_required
def index(request):
# 'request.user' contiene los datos del usuario que está navegando
return render(request, 'index.html')
return render(request, 'index.html')
@login_required
def mi_perfil(request):
perfil_form = PerfilForm(instance=request.user)
password_form = PasswordChangeForm(user=request.user)
if request.method == 'POST':
if 'guardar_perfil' in request.POST:
perfil_form = PerfilForm(request.POST, instance=request.user)
if perfil_form.is_valid():
perfil_form.save()
messages.success(request, 'Tus datos se han actualizado correctamente.')
return redirect('mi_perfil')
elif 'cambiar_password' in request.POST:
password_form = PasswordChangeForm(user=request.user, data=request.POST)
if password_form.is_valid():
user = password_form.save()
update_session_auth_hash(request, user)
messages.success(request, 'Tu contraseña se ha cambiado correctamente.')
return redirect('mi_perfil')
context = {
'perfil_form': perfil_form,
'password_form': password_form,
}
return render(request, 'mi_perfil.html', context)