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