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
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.
- De gebruiker voert gegevens in en verstuurt het formulier.
- Django roept de
is_valid()
methode aan om de gegevens te valideren. - 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.
댓글이 없습니다.