diff --git a/python-total/dia_16/README.md b/python-total/dia_16/README.md index 7452dd1..caa2fdc 100644 --- a/python-total/dia_16/README.md +++ b/python-total/dia_16/README.md @@ -808,6 +808,96 @@ fields = ['titulo', 'descripcion', 'completo'] ## 16.17. - Registrar nuevo usuario +> Siempre vamos cambiando lo mismo: Enlace, formulario, vista y urls. + +Empezamos por el enlace en la login.html: +```html +

No tienes cuentaRegistrate

+``` + +Ahora vamos a crear un nuevo fichero en templates que se llame registro.html: +```html +

Registro

+ +
+ {% csrf_token %} + {{form.as_p}} + + +
+ +

Ya tienes cuenta?Registrate

+``` + +Ahora creamos una vista para esto en views.py. No hay una vista específica en Django para crear registros, pero podemos aprovechar una vista genérica. Tenemos que añadir 3 clases/métodos: +```python +from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth import login +``` + +Y añadimos la clase PaginaRegistro: +```python +class PaginaRegistro[FormView]: + template_name = 'base/registro.html' + form_class = UserCreationForm + redirect_authenticated_user = True + success_url = reverse_lazy('tareas') +``` + +Ahora podemos crear el path en la url, antes importando la clase +```python +path('registro/', PaginaRegistro.as_view(), name='registro'), +``` + +Ahora mismo tenemos el formulario en inglés: + +![](../img/dia16_37.png) + +Pero lo podemos cambiar al castellano o a muchos otros idiomas en settings.py: +```python +LANGUAGE_CODE = 'es-es' +``` + +Cuando actualicemos la página de registro lo tendremos en español: + +![](../img/dia16_38.png) + +Para asegurarnos que se loguee el usuario una vez se registre, tenemos que ir a views para sobreescribir PaginaRegistro con una función: +```python +def form_valid(self, form): + usuario = form.save() + if usuario is not None: + login(self.request, usuario) + return super(PaginaRegistro, self).form_valid(form) +``` + +Y para asegurarnos de que un usuario registrado no pueda entrar en la página de registro de nuevo, vamos a modificar de nuevo la clase. Con esto último, la clase entera queda así: +```python +class PaginaRegistro(FormView): + template_name = 'base/registro.html' + form_class = UserCreationForm + redirect_authenticated_user = True + success_url = reverse_lazy('tareas') + + def form_valid(self, form): + usuario = form.save() + + if usuario is not None: + login(self.request, usuario) + + return super(PaginaRegistro, self).form_valid(form) + + def get(self, *args, **kwargs): + + if self.request.user.is_authenticated: + + return redirect('tareas') + + return super(PaginaRegistro, self.get(*args, **kwargs)) +``` + + ## 16.18. - Barra de búsquedas ## 16.19. - Un estilo para todas las vistas diff --git a/python-total/dia_16/mi_web/src/proyecto/base/templates/base/login.html b/python-total/dia_16/mi_web/src/proyecto/base/templates/base/login.html index 86332c6..45c1a0b 100644 --- a/python-total/dia_16/mi_web/src/proyecto/base/templates/base/login.html +++ b/python-total/dia_16/mi_web/src/proyecto/base/templates/base/login.html @@ -7,3 +7,5 @@ + +

¿No tienes cuenta?Registrate

diff --git a/python-total/dia_16/mi_web/src/proyecto/base/templates/base/registro.html b/python-total/dia_16/mi_web/src/proyecto/base/templates/base/registro.html new file mode 100644 index 0000000..3f4acd2 --- /dev/null +++ b/python-total/dia_16/mi_web/src/proyecto/base/templates/base/registro.html @@ -0,0 +1,11 @@ +

Registro

+ +
+ {% csrf_token %} + {{form.as_p}} + + + +
+ +

Ya tienes cuenta?Registrate

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 6471698..b8f0d0d 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,11 +1,12 @@ from django.urls import path -from .views import ListaPendientes, DetalleTarea, CrearTarea, EditarTarea, EliminarTarea, Logueo +from .views import ListaPendientes, DetalleTarea, CrearTarea, EditarTarea, EliminarTarea, Logueo, PaginaRegistro from django.contrib.auth.views import LogoutView urlpatterns = [ path('', ListaPendientes.as_view(), name='tareas'), path('login/', Logueo.as_view(), name='login'), + path('registro/', PaginaRegistro.as_view(), name='registro'), 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'), 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 e919b82..7bcdff5 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 @@ -1,7 +1,9 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect 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.views.generic.edit import CreateView, UpdateView, DeleteView, FormView +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth import login from django.contrib.auth.views import LoginView from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy @@ -19,6 +21,26 @@ class Logueo(LoginView): return reverse_lazy('tareas') +class PaginaRegistro(FormView): + template_name = 'base/registro.html' + form_class = UserCreationForm + redirect_authenticated_user = True + success_url = reverse_lazy('tareas') + + def form_valid(self, form): + + usuario = form.save() + if usuario is not None: + login(self.request, usuario) + + return super(PaginaRegistro, self).form_valid(form) + + def get(self, *args, **kwargs): + if self.request.user.is_authenticated: + return redirect('tareas') + return super(PaginaRegistro, self.get(*args, **kwargs)) + + class ListaPendientes(LoginRequiredMixin, ListView): model = Tarea context_object_name = '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 639bacf..e1dd618 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 @@ -104,7 +104,7 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/4.2/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'es-es' TIME_ZONE = 'UTC' diff --git a/python-total/img/dia16_37.png b/python-total/img/dia16_37.png new file mode 100644 index 0000000..00d1c6b Binary files /dev/null and b/python-total/img/dia16_37.png differ diff --git a/python-total/img/dia16_38.png b/python-total/img/dia16_38.png new file mode 100644 index 0000000..e5818c2 Binary files /dev/null and b/python-total/img/dia16_38.png differ