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

  1. Sistema d'Autenticació de Django: Inclou models per a usuaris i grups, així com vistes i formularis per a la gestió d'usuaris.
  2. Vistes d'Autenticació: Django proporciona vistes genèriques per a l'inici de sessió, tancament de sessió, registre, canvi de contrasenya, etc.
  3. 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:

# settings.py

INSTALLED_APPS = [
    ...
    'django.contrib.auth',
    'django.contrib.contenttypes',
    ...
]

Migracions Inicials

Executa les migracions per crear les taules necessàries a la base de dades:

python manage.py migrate

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:

python manage.py shell
from django.contrib.auth.models import User

# Crear un usuari
user = User.objects.create_user('nom_usuari', '[email protected]', 'contrasenya123')

# Crear un superusuari
superuser = User.objects.create_superuser('admin', '[email protected]', '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_data

Vista 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

  1. Crear un Usuari: Utilitza la interfície d'administració per crear un nou usuari i prova iniciar sessió amb aquest usuari.
  2. Personalitzar el Formulari de Registre: Afegeix camps addicionals al formulari de registre, com ara el nom complet i la data de naixement.
  3. 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_data

Exercici 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.

© Copyright 2024. Tots els drets reservats