Update day 16

Signed-off-by: Manuel Vergara <manuel@vergaracarmona.es>
This commit is contained in:
Manuel Vergara 2023-05-25 21:42:51 +02:00
parent 20b227ce65
commit 63ea50d53c
8 changed files with 130 additions and 4 deletions

View File

@ -808,6 +808,96 @@ fields = ['titulo', 'descripcion', 'completo']
## 16.17. - Registrar nuevo usuario ## 16.17. - Registrar nuevo usuario
> Siempre vamos cambiando lo mismo: Enlace, formulario, vista y urls.
Empezamos por el enlace en la login.html:
```html
<p>No tienes cuenta<a href="{% url 'registro' %}">Registrate</a></p>
```
Ahora vamos a crear un nuevo fichero en templates que se llame registro.html:
```html
<h1>Registro</h1>
<form method="post" action="">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Registrar">
</form>
<p>Ya tienes cuenta?<a href="{% url 'login' %}">Registrate</a></p>
```
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.18. - Barra de búsquedas
## 16.19. - Un estilo para todas las vistas ## 16.19. - Un estilo para todas las vistas

View File

@ -7,3 +7,5 @@
<input type="submit" value="Ingresar"> <input type="submit" value="Ingresar">
</form> </form>
<p>¿No tienes cuenta?<a href="{% url 'registro' %}">Registrate</a></p>

View File

@ -0,0 +1,11 @@
<h1>Registro</h1>
<form method="post" action="">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Registrar">
</form>
<p>Ya tienes cuenta?<a href="{% url 'login' %}">Registrate</a></p>

View File

@ -1,11 +1,12 @@
from django.urls import path 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 from django.contrib.auth.views import LogoutView
urlpatterns = [ urlpatterns = [
path('', ListaPendientes.as_view(), name='tareas'), path('', ListaPendientes.as_view(), name='tareas'),
path('login/', Logueo.as_view(), name='login'), 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('logout/', LogoutView.as_view(next_page='login'), name='logout'),
path('tarea/<int:pk>', DetalleTarea.as_view(), name='tarea'), path('tarea/<int:pk>', DetalleTarea.as_view(), name='tarea'),
path('crear-tarea/', CrearTarea.as_view(), name='crear-tarea'), path('crear-tarea/', CrearTarea.as_view(), name='crear-tarea'),

View File

@ -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.list import ListView
from django.views.generic.detail import DetailView 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.views import LoginView
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy from django.urls import reverse_lazy
@ -19,6 +21,26 @@ class Logueo(LoginView):
return reverse_lazy('tareas') 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): class ListaPendientes(LoginRequiredMixin, ListView):
model = Tarea model = Tarea
context_object_name = 'tareas' context_object_name = 'tareas'

View File

@ -104,7 +104,7 @@ AUTH_PASSWORD_VALIDATORS = [
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/ # https://docs.djangoproject.com/en/4.2/topics/i18n/
LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'es-es'
TIME_ZONE = 'UTC' TIME_ZONE = 'UTC'

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB