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
+
+
+```
+
+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/