python / intermediate
Snippet
Django Formulare Validierung mit clean Methoden
Django Formulare bieten zwei Validierungsebenen: Feld-Level clean Methoden und Objekt-Level clean(). Feldspezifische clean_<feldname> Methoden werden automatisch nach Einzel-Feld-Validierung ausgeführt. Die clean() Methode führt bereichsübergreifende Validierung nach allen Feld-Level Prüfungen durch. Dieser geschichtete Ansatz stellt Datenkonsistenz sicher und bietet klare Fehlermeldungen.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from django import formsfrom django.core.exceptions import ValidationErrorclass BookingForm(forms.Form):check_in = forms.DateField(label='Check-in Date')check_out = forms.DateField(label='Check-out Date')guests = forms.IntegerField(min_value=1, max_value=10)room_type = forms.ChoiceField(choices=[('standard', 'Standard'),('deluxe', 'Deluxe'),('suite', 'Suite')])def clean_check_out(self):check_in = self.cleaned_data.get('check_in')check_out = self.cleaned_data.get('check_out')if check_in and check_out:if check_out <= check_in:raise ValidationError('Check-out must be after check-in date')delta = check_out - check_inif delta.days > 30:raise ValidationError('Maximum stay is 30 nights')return check_outdef clean(self):cleaned_data = super().clean()check_in = cleaned_data.get('check_in')room_type = cleaned_data.get('room_type')if check_in and check_in < forms.DateField().to_python(forms.DateField().initial):raise ValidationError('Cannot book dates in the past')if room_type == 'suite' and cleaned_data.get('guests', 0) > 4:raise ValidationError('Suite rooms accommodate maximum 4 guests')return cleaned_data
django
Erklärung
1
class BookingForm(forms.Form):
Definiere eine Django Formular-Klasse erbend von forms.Form
2
check_in = forms.DateField(...)
Datumsfeld für Check-in Datumseingabe
3
def clean_check_out(self):
Feldspezifische Validierungsmethode für Check-out Feld
4
check_in = self.cleaned_data.get('check_in')
Zugreifen auf andere bereinigte Felder um Daten zu vergleichen
5
if check_out <= check_in:
Geschäftsregel: Check-out muss nach Check-in sein
6
raise ValidationError(...)
Django verknüpft Fehler automatisch mit dem Feld
7
def clean(self):
Bereichsübergreifende Validierungsmethode nach allen Feld-Level cleans aufgerufen
8
cleaned_data = super().clean()
Eltern clean() aufrufen um sicherzustellen dass alle Felder bereits bereinigt sind
9
return cleaned_data
Muss das bereinigte Daten-Dictionary zurückgeben