From af00070aeba0e63f06f49767048a5b0a137951ad Mon Sep 17 00:00:00 2001 From: Manuel Vergara Date: Wed, 24 May 2023 00:15:01 +0200 Subject: [PATCH] Update day 16 Signed-off-by: Manuel Vergara --- python-total/dia_16/README.md | 61 ++++++++++++++++++- .../base/templates/base/tarea_list.html | 2 +- .../dia_16/mi_web/src/proyecto/base/urls.py | 2 + .../dia_16/mi_web/src/proyecto/base/views.py | 11 ++-- .../mi_web/src/proyecto/proyecto/settings.py | 1 + 5 files changed, 70 insertions(+), 7 deletions(-) diff --git a/python-total/dia_16/README.md b/python-total/dia_16/README.md index 3b47863..2b854a6 100644 --- a/python-total/dia_16/README.md +++ b/python-total/dia_16/README.md @@ -697,7 +697,7 @@ Vamos a poner el anterior fragmento de código dentro de un if, quedando así:

{{request.user}}

- Salir + Salir {% else %} @@ -710,8 +710,67 @@ En el siguiente punto veremos como construir el formulario de logueo. ## 16.14. - Formulario de Logueo / Deslogueo +Nos vamos a views.py, importamos la siguiente vista: +```python +from django.contrib.auth.views import LoginView +``` + +Y añadimos la siguiente clase, que tiene sentido que este arriba del todo, y dentro de la clase definimos el nombre del template, que queremos todos los campos que contiene LoginView, activar la redirección después de la autenticación y redefinimos la función get_success_url para que vaya a la página principal después del loguearse: +class Logueo(LoginView): +```python +template_name = "base/login.html" +field = '__all__' +redirect_authenticated_user = True +def get_success_url(self): + return reverse_lazy('tareas') +``` +Ahora vamos a configurar las urls.py para que llegue al path. Importamos Logueo y añadimos el path: +```python +path('login/', Logueo.as_view(), name='login'), +``` + +Creamos el fichero en login.html en template/base con el siguiente contenido: +```html +

Ingresar

+ +
+ + {% csrf_token %} + + {{form.as_p}} + + +
+``` + +Para desloguear vamos a usar directamente el formulario que nos brinda django. En urls.py importamos la siguiente clase: +```python +from django.contrib.auth.views import LogoutView +``` + +y añadimos el path: +```python +path('logout/', LogoutView.as_view(next_page='login'), name='logout'), +``` + ## 16.15. - Restringir acceso +Nos vamos a views.py e importamos nueva clase: +```python +from django.contrib.auth.mixins import LoginRequiredMixin +``` + +Con esta clase podríamos gestionar los atributos de un determinado usuario, si va a ser administrador, si va a tener alguna otra autorización especial, si va a ser un usuario común. Etc También la restricción de las vistas. + +Tendremos que incluirlo en las clase que queramos que herede esta opción, como en ListaPendientes, en DetalleTarea y en definitiva, en todas las clases menos en la de logueo. + +Pero si ahora intentamos entrar sin estar logueados nos saldrá un página de error de django. Para personalizarla tenemos que ir a settings.py y vamos a incluir esta línea de código antes de Static Files: +```python +LOGIN_URL = 'login' +``` + +Así nos desviará a la página de logueo sin no estamos registrados. + ## 16.16. - Información específica de usuario ## 16.17. - Registrar nuevo usuario diff --git a/python-total/dia_16/mi_web/src/proyecto/base/templates/base/tarea_list.html b/python-total/dia_16/mi_web/src/proyecto/base/templates/base/tarea_list.html index 1d3d4ad..dc37b6d 100644 --- a/python-total/dia_16/mi_web/src/proyecto/base/templates/base/tarea_list.html +++ b/python-total/dia_16/mi_web/src/proyecto/base/templates/base/tarea_list.html @@ -2,7 +2,7 @@

{{request.user}}

- Salir + Salir {% else %} diff --git a/python-total/dia_16/mi_web/src/proyecto/base/urls.py b/python-total/dia_16/mi_web/src/proyecto/base/urls.py index 0aca2cd..6471698 100644 --- a/python-total/dia_16/mi_web/src/proyecto/base/urls.py +++ b/python-total/dia_16/mi_web/src/proyecto/base/urls.py @@ -1,10 +1,12 @@ from django.urls import path from .views import ListaPendientes, DetalleTarea, CrearTarea, EditarTarea, EliminarTarea, Logueo +from django.contrib.auth.views import LogoutView urlpatterns = [ path('', ListaPendientes.as_view(), name='tareas'), path('login/', Logueo.as_view(), name='login'), + path('logout/', LogoutView.as_view(next_page='login'), name='logout'), path('tarea/', DetalleTarea.as_view(), name='tarea'), path('crear-tarea/', CrearTarea.as_view(), name='crear-tarea'), path('editar-tarea/', EditarTarea.as_view(), name='editar-tarea'), diff --git a/python-total/dia_16/mi_web/src/proyecto/base/views.py b/python-total/dia_16/mi_web/src/proyecto/base/views.py index 00bbbb8..3434af8 100644 --- a/python-total/dia_16/mi_web/src/proyecto/base/views.py +++ b/python-total/dia_16/mi_web/src/proyecto/base/views.py @@ -3,6 +3,7 @@ from django.views.generic.list import ListView from django.views.generic.detail import DetailView from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.contrib.auth.views import LoginView +from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy from .models import Tarea @@ -18,30 +19,30 @@ class Logueo(LoginView): return reverse_lazy('tareas') -class ListaPendientes(ListView): +class ListaPendientes(LoginRequiredMixin, ListView): model = Tarea context_object_name = 'tareas' -class DetalleTarea(DetailView): +class DetalleTarea(LoginRequiredMixin, DetailView): model = Tarea context_object_name = 'tarea' template_name = 'base/tarea.html' -class CrearTarea(CreateView): +class CrearTarea(LoginRequiredMixin, CreateView): model = Tarea fields = '__all__' success_url = reverse_lazy('tareas') -class EditarTarea(UpdateView): +class EditarTarea(LoginRequiredMixin, UpdateView): model = Tarea fields = '__all__' success_url = reverse_lazy('tareas') -class EliminarTarea(DeleteView): +class EliminarTarea(LoginRequiredMixin, DeleteView): model = Tarea context_object_name = 'tarea' success_url = reverse_lazy('tareas') diff --git a/python-total/dia_16/mi_web/src/proyecto/proyecto/settings.py b/python-total/dia_16/mi_web/src/proyecto/proyecto/settings.py index 48da6bf..639bacf 100644 --- a/python-total/dia_16/mi_web/src/proyecto/proyecto/settings.py +++ b/python-total/dia_16/mi_web/src/proyecto/proyecto/settings.py @@ -112,6 +112,7 @@ USE_I18N = True USE_TZ = True +LOGIN_URL = 'login' # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.2/howto/static-files/