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
|
## 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
|
||||||
|
@ -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>
|
||||||
|
@ -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 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'),
|
||||||
|
@ -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'
|
||||||
|
@ -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'
|
||||||
|
|
||||||
|
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