diff --git a/essenza/db.sqlite3 b/essenza/db.sqlite3 index 682e0b4..a07469d 100644 Binary files a/essenza/db.sqlite3 and b/essenza/db.sqlite3 differ diff --git a/essenza/essenza/settings.py b/essenza/essenza/settings.py index 229be2e..82d2acc 100644 --- a/essenza/essenza/settings.py +++ b/essenza/essenza/settings.py @@ -58,7 +58,7 @@ TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], + 'DIRS': [ BASE_DIR / 'templates' ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -119,11 +119,12 @@ # https://docs.djangoproject.com/en/5.2/howto/static-files/ STATIC_URL = 'static/' - +STATICFILES_DIRS = [BASE_DIR / 'static'] # Default primary key field type # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + # ----------------------------------------------------------------- # SOLUCIÓN AL ERROR E304 # Especifica que nuestro modelo 'Usuario' en la app 'user' diff --git a/essenza/essenza/urls.py b/essenza/essenza/urls.py index 05f4b11..d14c13c 100644 --- a/essenza/essenza/urls.py +++ b/essenza/essenza/urls.py @@ -1,5 +1,5 @@ from django.contrib import admin -from django.urls import path +from django.urls import path, include from django.http import HttpResponse from info import views @@ -15,8 +15,7 @@ def home(request): text-align: center; padding-top: 100px; color: #444; - /* Aseguramos que el cuerpo permita posicionamiento absoluto para el botón */ - position: relative; + position: relative; } h1 { color: #c06b3e; @@ -27,36 +26,55 @@ def home(request): font-size: 20px; color: #555; } - /* Estilo para el botón de Información (simulando la 'i' del mockup) */ .info-button { position: absolute; - top: 20px; /* Distancia desde la parte superior */ - left: 20px; /* Distancia desde la izquierda */ + top: 20px; + left: 20px; width: 30px; height: 30px; - background-color: #c06b3e; /* Color corporativo o distintivo */ - border-radius: 50%; /* Forma circular */ + background-color: #c06b3e; + border-radius: 50%; text-align: center; - line-height: 30px; /* Centra verticalmente la 'i' */ + line-height: 30px; font-size: 18px; font-weight: bold; color: white; - text-decoration: none; /* Elimina el subrayado del enlace */ + text-decoration: none; cursor: pointer; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 4px rgba(0,0,0,0.2); transition: background-color 0.3s; } - .info-button:hover { - background-color: #a35a34; /* Oscurece al pasar el ratón */ + .info-button:hover { background-color: #a35a34; } + .login-button { + position: absolute; + top: 60%; + left: 50%; + transform: translate(-50%, -50%); + padding: 15px 35px; + background-color: #c06b3e; + color: white; + font-size: 20px; + font-weight: bold; + border: none; + border-radius: 10px; + cursor: pointer; + box-shadow: 0 4px 8px rgba(0,0,0,0.2); + text-decoration: none; + transition: background-color 0.3s, transform 0.2s; + } + .login-button:hover { + background-color: #a35a34; + transform: translate(-50%, -50%) scale(1.05); } i -

Bienvenidos a Essenza

Tu espacio online de cosmética natural, belleza y cuidado personal.

Explora nuestros productos, descubre nuevas fragancias y disfruta de la experiencia Essenza 🌸

+ + Iniciar sesión """ @@ -65,6 +83,9 @@ def home(request): urlpatterns = [ path('', home, name='home'), path('info/', views.info_view, name='info-home'), - path('admin/', admin.site.urls), + path("user/", include("user.urls")), + path('user/login/', include('user.urls')), + path("accounts/", include("django.contrib.auth.urls")), + path('admin/', admin.site.urls) ] diff --git a/essenza/templates/user/login.html b/essenza/templates/user/login.html new file mode 100644 index 0000000..f1f47ba --- /dev/null +++ b/essenza/templates/user/login.html @@ -0,0 +1,97 @@ +{% load static %} + + + + + Iniciar sesión · Essenza + + + + + + + +
+

ESSENZA

+ +
+
+ {% csrf_token %} + + + {{ form.email }} + + + {{ form.password }} + + {% if form.non_field_errors %} +

{{ form.non_field_errors.0 }}

+ {% endif %} + + + +

+ ¿Has olvidado la contraseña? +

+
+
+
+ + + diff --git a/essenza/user/forms.py b/essenza/user/forms.py new file mode 100644 index 0000000..3943885 --- /dev/null +++ b/essenza/user/forms.py @@ -0,0 +1,12 @@ +# user/forms.py +from django import forms + +class LoginForm(forms.Form): + email = forms.CharField( + label="Correo electrónico o usuario", + widget=forms.TextInput(attrs={"placeholder": "Introduce tu correo o usuario"}) + ) + password = forms.CharField( + label="Contraseña", + widget=forms.PasswordInput(attrs={"placeholder": "Introduce tu contraseña"}) + ) diff --git a/essenza/user/models.py b/essenza/user/models.py index 334e657..76688e1 100644 --- a/essenza/user/models.py +++ b/essenza/user/models.py @@ -9,6 +9,10 @@ class Usuario(AbstractUser): foto = models.ImageField(upload_to='images/', null=True, blank=True) role = models.CharField(max_length=10, choices=Role.choices, default=Role.USER) - + email = models.EmailField(unique=True) # <-- aseguramos emails únicos + + USERNAME_FIELD = 'email' # <-- se usará email para login + REQUIRED_FIELDS = ['username'] + def __str__(self): - return self.username \ No newline at end of file + return self.email \ No newline at end of file diff --git a/essenza/user/urls.py b/essenza/user/urls.py new file mode 100644 index 0000000..04aeb23 --- /dev/null +++ b/essenza/user/urls.py @@ -0,0 +1,9 @@ +from django.contrib import admin +from django.urls import include, path +from django.http import HttpResponse +from user import views + +urlpatterns = [ + path('login/', views.LoginView.as_view(), name='login'), +] + diff --git a/essenza/user/views.py b/essenza/user/views.py index 91ea44a..ed8a914 100644 --- a/essenza/user/views.py +++ b/essenza/user/views.py @@ -1,3 +1,34 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect +from django.views import View +from django.contrib.auth import authenticate, login + +from essenza.urls import home +from .forms import LoginForm + + +class LoginView(View): + form_class = LoginForm + template_name = 'user/login.html' + + + def get(self, request, *args, **kwargs): + if request.user.is_authenticated: + return redirect('home') + return render(request, self.template_name, {'form': self.form_class()}) + + def post(self, request, *args, **kwargs): + form = self.form_class(request.POST) + if form.is_valid(): + email = form.cleaned_data["email"] + password = form.cleaned_data["password"] + + user = authenticate(request, username=email, password=password) + + if user is not None: + login(request, user) + return redirect('home') + else: + form.add_error(None, "Usuario o contraseña incorrectos") + + return render(request, self.template_name, {'form': form}) -# Create your views here.