Update day 16
Signed-off-by: Manuel Vergara <manuel@vergaracarmona.es>
This commit is contained in:
parent
20b227ce65
commit
63ea50d53c
@ -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
|
||||
<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.19. - Un estilo para todas las vistas
|
||||
|
@ -7,3 +7,5 @@
|
||||
<input type="submit" value="Ingresar">
|
||||
|
||||
</form>
|
||||
|
||||
<p>¿No tienes cuenta?<a href="{% url 'registro' %}">Registrate</a></p>
|
||||
|
@ -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>
|
@ -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/<int:pk>', DetalleTarea.as_view(), name='tarea'),
|
||||
path('crear-tarea/', CrearTarea.as_view(), name='crear-tarea'),
|
||||
|
@ -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'
|
||||
|
@ -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'
|
||||
|
||||
|
BIN
python-total/img/dia16_37.png
Normal file
BIN
python-total/img/dia16_37.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 62 KiB |
BIN
python-total/img/dia16_38.png
Normal file
BIN
python-total/img/dia16_38.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 67 KiB |
Loading…
Reference in New Issue
Block a user