Introducció
L'autenticació d'usuaris és una part fonamental de moltes aplicacions web. Django proporciona un sistema d'autenticació robust i fàcil d'utilitzar que permet gestionar usuaris, grups, permisos i sessions. En aquesta secció, aprendrem com implementar l'autenticació d'usuaris en una aplicació Django.
Conceptes Clau
- Sistema d'Autenticació de Django: Inclou models per a usuaris i grups, així com vistes i formularis per a la gestió d'usuaris.
- Vistes d'Autenticació: Django proporciona vistes genèriques per a l'inici de sessió, tancament de sessió, registre, canvi de contrasenya, etc.
- Permisos i Grups: Permeten controlar l'accés a diferents parts de l'aplicació basant-se en els rols dels usuaris.
Configuració Inicial
Instal·lació de l'Aplicació d'Autenticació
Django ve amb l'aplicació django.contrib.auth preinstal·lada. Assegura't que està inclosa en la configuració del teu projecte:
Migracions Inicials
Executa les migracions per crear les taules necessàries a la base de dades:
Creació d'Usuaris
Utilitzant la Interfície d'Administració
La manera més senzilla de crear usuaris és utilitzant la interfície d'administració de Django. Accedeix a /admin i crea un nou usuari.
Utilitzant el Shell de Django
També pots crear usuaris des del shell de Django:
from django.contrib.auth.models import User
# Crear un usuari
user = User.objects.create_user('nom_usuari', 'email@example.com', 'contrasenya123')
# Crear un superusuari
superuser = User.objects.create_superuser('admin', 'admin@example.com', 'admin123')Vistes d'Autenticació
Django proporciona vistes genèriques per a l'autenticació d'usuaris. A continuació, veurem com configurar-les.
Inici de Sessió
URL
# urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
urlpatterns = [
...
path('login/', auth_views.LoginView.as_view(), name='login'),
...
]Plantilla
Crea una plantilla registration/login.html:
<!-- templates/registration/login.html -->
{% extends "base_generic.html" %}
{% block content %}
<h2>Inici de Sessió</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Iniciar Sessió</button>
</form>
{% endblock %}Tancament de Sessió
URL
# urls.py
urlpatterns = [
...
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
...
]Plantilla
Crea una plantilla registration/logged_out.html:
<!-- templates/registration/logged_out.html -->
{% extends "base_generic.html" %}
{% block content %}
<h2>Has tancat la sessió correctament</h2>
{% endblock %}Registre d'Usuaris
Per al registre d'usuaris, necessitarem crear una vista personalitzada.
Formulari de Registre
# forms.py
from django import forms
from django.contrib.auth.models import User
class RegisterForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)
password_confirm = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = ['username', 'email', 'password']
def clean(self):
cleaned_data = super().clean()
password = cleaned_data.get("password")
password_confirm = cleaned_data.get("password_confirm")
if password != password_confirm:
raise forms.ValidationError("Les contrasenyes no coincideixen")
return cleaned_dataVista de Registre
# views.py
from django.shortcuts import render, redirect
from django.contrib.auth import login
from .forms import RegisterForm
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.set_password(form.cleaned_data['password'])
user.save()
login(request, user)
return redirect('home')
else:
form = RegisterForm()
return render(request, 'registration/register.html', {'form': form})URL
# urls.py
from . import views
urlpatterns = [
...
path('register/', views.register, name='register'),
...
]Plantilla
Crea una plantilla registration/register.html:
<!-- templates/registration/register.html -->
{% extends "base_generic.html" %}
{% block content %}
<h2>Registre</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Registrar-se</button>
</form>
{% endblock %}Exercicis Pràctics
- Crear un Usuari: Utilitza la interfície d'administració per crear un nou usuari i prova iniciar sessió amb aquest usuari.
- Personalitzar el Formulari de Registre: Afegeix camps addicionals al formulari de registre, com ara el nom complet i la data de naixement.
- Redirigir després del Tancament de Sessió: Modifica la vista de tancament de sessió per redirigir a una pàgina específica després de tancar la sessió.
Solucions
Exercici 1: Crear un Usuari
Accedeix a /admin, crea un nou usuari i prova iniciar sessió amb aquest usuari a /login.
Exercici 2: Personalitzar el Formulari de Registre
# forms.py
class RegisterForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)
password_confirm = forms.CharField(widget=forms.PasswordInput)
full_name = forms.CharField(max_length=100)
birth_date = forms.DateField()
class Meta:
model = User
fields = ['username', 'email', 'password', 'full_name', 'birth_date']
def clean(self):
cleaned_data = super().clean()
password = cleaned_data.get("password")
password_confirm = cleaned_data.get("password_confirm")
if password != password_confirm:
raise forms.ValidationError("Les contrasenyes no coincideixen")
return cleaned_dataExercici 3: Redirigir després del Tancament de Sessió
# urls.py
from django.contrib.auth.views import LogoutView
urlpatterns = [
...
path('logout/', LogoutView.as_view(next_page='home'), name='logout'),
...
]Conclusió
En aquesta secció, hem après com implementar l'autenticació d'usuaris en una aplicació Django. Hem vist com configurar les vistes d'inici de sessió, tancament de sessió i registre, així com com crear usuaris utilitzant la interfície d'administració i el shell de Django. A la següent secció, explorarem com gestionar formularis en Django.
Curs de Desenvolupament Web amb Django
Mòdul 1: Introducció a Django
- Què és Django?
- Configuració de l'Entorn de Desenvolupament
- Creació del teu Primer Projecte Django
- Comprensió de l'Estructura del Projecte Django
Mòdul 2: Conceptes Bàsics de Django
- Aplicacions Django i Estructura del Projecte
- Enrutament d'URL i Vistes
- Plantilles i Fitxers Estàtics
- Models i Bases de Dades
- Interfície d'Administració de Django
Mòdul 3: Django Intermedi
Mòdul 4: Django Avançat
- Consultes Avançades amb Django ORM
- Models d'Usuari Personalitzats
- Senyalitzacions de Django
- Proves en Django
- Optimització del Rendiment
