Een van de krachtigste kenmerken van Django Forms is validatie. Het valideert automatisch de gegevens die door de gebruiker zijn ingevoerd voordat ze naar de server worden verzonden, waardoor veiligheid en nauwkeurigheid worden gegarandeerd. In deze blogpost zullen we de validatiemechanismen van Django Forms bekijken en hoe deze kunnen worden aangepast.

1. Basisvalidatie

A diagram showcasing Django Forms validation workflow, including key steps like form submission, field validation, and error handling

1.1 Wat is validatie?

Django Forms controleert of de gegevens voldoen aan de vereisten van de formuliervelden. Dit proces bestaat uit basisvalidatie die wordt aangeboden door het formulier en aangepaste validatie die door de ontwikkelaar wordt gedefinieerd.

Voorbeeld van basisvalidatie
from django import forms

class RegistrationForm(forms.Form):
    username = forms.CharField(max_length=30, required=True)
    email = forms.EmailField(required=True)
    password = forms.CharField(widget=forms.PasswordInput, required=True)
  • username: Limiet van 30 tekens.
  • email: Controleert of het een geldig e-mailadres is.
  • password: Vereist invoer en gebruikt een wachtwoord veld.

1.2 Gegevensvalidatiestroom

Django Forms slaat de gevalideerde gegevens op in cleaned_data, wat wordt geretourneerd in de vorm van een dictionary met de veldnamen als sleutels.

  • Als de gegevensvalidatie faalt, worden foutmeldingen opgeslagen in de form.errors eigenschap in de vorm van een dictionary. Elke veldnaam is de sleutel, en de foutmelding van dat veld is de waarde.
  1. De gebruiker voert gegevens in en verstuurt het formulier.
  2. Django roept de is_valid() methode aan om de gegevens te valideren.
  3. Als de gegevens geldig zijn, worden ze opgeslagen in cleaned_data; zo niet, dan worden foutmeldingen toegevoegd.
Voorbeeld van gegevensvalidatiestroom
form = RegistrationForm(request.POST)
if form.is_valid():
    username = form.cleaned_data['username']
    email = form.cleaned_data['email']
    password = form.cleaned_data['password']
else:
    print(form.errors)  # Foutafdrukken bij mislukte validatie

2. Aangepaste validatie per veld

2.1 clean_fieldname() methode

Om de validiteit van een specifiek veld aan te passen, definieert u de clean_fieldname() methode.

Voorbeeld: Controle van dubbele gebruikersnaam
class RegistrationForm(forms.Form):
    username = forms.CharField(max_length=30)

    def clean_username(self):
        username = self.cleaned_data['username']
        if username.lower() == 'admin':
            raise forms.ValidationError("'admin' kan niet als gebruikersnaam worden gebruikt.")
        return username

Werking: De clean_username() methode controleert de validiteit van het username veld en genereert een uitzondering als er een probleem is.

3. Validatie van het hele formulier

3.1 clean() methode

Als validatie op basis van de gegevens van het hele formulier nodig is, overschrijft u de clean() methode.

Voorbeeld: Bevestiging van wachtwoord
class PasswordChangeForm(forms.Form):
    new_password = forms.CharField(widget=forms.PasswordInput)
    confirm_password = forms.CharField(widget=forms.PasswordInput)

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get("new_password")
        confirm_password = cleaned_data.get("confirm_password")

        if password != confirm_password:
            raise forms.ValidationError("De wachtwoorden komen niet overeen.")

        return cleaned_data

Gebruik: Gebruikt wanneer onderlinge validatie tussen velden nodig is.

4. Aangepaste foutmeldingen

Django Forms biedt standaard foutmeldingen. U kunt ze echter aanpassen voor gebruiksvriendelijkere berichten.

4.1 Wijziging van veldfoutmeldingen

Voorbeeld: Specifieke foutmeldingen per veld
class CustomErrorForm(forms.Form):
    email = forms.EmailField(
        error_messages={
            'required': "Voer uw e-mailadres in.",
            'invalid': "Voer een geldig e-mailadres in."
        }
    )

4.2 Behandeling van totale formulierfouten

Voorbeeld: Foutmelding bij wachtwoordvalidatie
class LoginForm(forms.Form):
    username = forms.CharField(max_length=30)
    password = forms.CharField(widget=forms.PasswordInput)

    def clean(self):
        cleaned_data = super().clean()
        username = cleaned_data.get('username')
        password = cleaned_data.get('password')

        # Voeg gebruikersauthenticatielogica toe
        if not authenticate(username=username, password=password):
            raise forms.ValidationError("Naam of wachtwoord is onjuist.")

5. Praktijkvoorbeeld: Complexe validatie

5.1 Implementatie van een registratieformulier

Formulierdefinitie
class SignupForm(forms.Form):
    username = forms.CharField(max_length=30)
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)
    confirm_password = forms.CharField(widget=forms.PasswordInput)

    def clean_username(self):
        username = self.cleaned_data['username']
        if User.objects.filter(username=username).exists():
            raise forms.ValidationError("Deze gebruikersnaam is al in gebruik.")
        return username

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get('password')
        confirm_password = cleaned_data.get('confirm_password')

        if password != confirm_password:
            raise forms.ValidationError("De wachtwoorden komen niet overeen.")
        return cleaned_data
Definitie van de view
from django.shortcuts import render, redirect
from .forms import SignupForm

def signup_view(request):
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if form.is_valid():
            User.objects.create_user(
                username=form.cleaned_data['username'],
                email=form.cleaned_data['email'],
                password=form.cleaned_data['password']
            )
            return redirect('login')
    else:
        form = SignupForm()
    return render(request, 'signup.html', {'form': form})

6. Conclusie

De validatie van Django Forms is een essentieel kenmerk voor het verbeteren van de nauwkeurigheid en veiligheid van gegevensinvoer. Naast de basisvalidatiefuncties kunt u de validatie ook aanpassen aan de eisen van uw project. In de volgende post zullen we formulierstyling met Django Forms en CSS bespreken.