In Django gibt es zwei Hauptformular-Klassen: forms.Form
und forms.ModelForm
. In diesem Artikel erkläre ich die Unterschiede zwischen den beiden Klassen und gebe anhand von Anwendungsfällen Hinweise, welche Form in welcher Situation gewählt werden sollte.
1. Überblick über forms.Form
und forms.ModelForm

1.1 Was ist forms.Form
?
- Unabhängige Formular-Klasse: Funktioniert unabhängig von Django-Modellen und ermöglicht es, die gewünschten Daten manuell zu definieren.
- Hauptverwendung: Wird verwendet, um Benutzereingaben zu validieren oder um Daten zu verarbeiten, die nicht direkt mit einem Modell verbunden sind.
Beispiel: Benutzerfeedback-Formular
from django import forms
class FeedbackForm(forms.Form):
name = forms.CharField(max_length=50, label="Ihr Name")
email = forms.EmailField(label="Ihre E-Mail")
message = forms.CharField(widget=forms.Textarea, label="Ihr Feedback")
1.2 Was ist forms.ModelForm
?
- Formular-Klasse mit Modellbindung: Direkt mit Django-Modellen verbunden, was die Interaktion mit der Datenbank automatisiert.
- Hauptverwendung: Wird verwendet, um Modellinstanzen zu erstellen, zu aktualisieren oder Daten eingeben zu lassen, die in der Datenbank gespeichert werden.
Beispiel: Blogbeitragserstellungsformular
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
2. Vergleich der Hauptunterschiede
Unterscheidungsmerkmal | forms.Form | forms.ModelForm |
---|---|---|
Beziehung zum Modell | Unabhängig vom Modell | Direkt mit Modell verbunden |
Datenverarbeitung | Daten nach Validierung manuell speichern | Daten automatisch speichern (Verwendung der form.save() -Methode) |
Felddefinition | Alle Felder explizit definieren | Felder des Modells automatisch in Formularfelder umwandeln |
Anwendungszweck | Unabhängige Datenverarbeitung oder Benutzereingabeformulare | Verknüpfte Formulare für Datenbankoperationen |
Flexibilität | Felder können frei gestaltet werden | Vom Modell abhängige Felder |
3. Anwendungsfälle
3.1 Anwendungsfall für forms.Form
- Datenverarbeitung ohne Modellbindung: Beispiel: Suchformular, Anmeldeformular, Passwort zurücksetzen Formular.
Suchformular-Beispiel
class SearchForm(forms.Form):
query = forms.CharField(max_length=100, label="Suche")
- Komplexe Benutzer-Eingaben verarbeiten: Beispiel: Eingabefelder, die nicht direkt im Modell gespeichert werden.
Passwortänderungsformular-Beispiel
class PasswordChangeForm(forms.Form):
old_password = forms.CharField(widget=forms.PasswordInput, label="Altes Passwort")
new_password = forms.CharField(widget=forms.PasswordInput, label="Neues Passwort")
confirm_password = forms.CharField(widget=forms.PasswordInput, label="Passwort bestätigen")
def clean(self):
cleaned_data = super().clean()
new_password = cleaned_data.get("new_password")
confirm_password = cleaned_data.get("confirm_password")
if new_password != confirm_password:
raise forms.ValidationError("Die Passwörter stimmen nicht überein.")
3.2 Anwendungsfall für forms.ModelForm
- Modellobjekte erstellen und aktualisieren: Beispiel: Blogbeiträge, Kommentare, Benutzerprofile bearbeiten.
Kommentarformular-Beispiel
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['author', 'text']
- Daten basierend auf Modellen eingeben: Beispiel: Bestehende Daten ändern oder in der Datenbank speichern.
4. Vergleich der Funktionsweise von Formularen
4.1 Datenvalidierung
forms.Form
: Felder und Validierungslogik manuell definieren.forms.ModelForm
: Automatische Anwendung der Validierungsregeln, die im Modell definiert sind.
Beispiel: Modellfeldvalidierung
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price']
- Das
price
-Feld validiert automatisch die im Modell definierten Einschränkungen (max_digits
,decimal_places
).
4.2 Datenspeicherung
forms.Form
: Datenverarbeitung mithilfe voncleaned_data
.forms.ModelForm
: Automatisches Speichern der Daten mit dersave()
-Methode.
Beispiel für Datenspeicherung mit forms.Form
form = FeedbackForm(request.POST)
if form.is_valid():
feedback = Feedback(
name=form.cleaned_data['name'],
email=form.cleaned_data['email'],
message=form.cleaned_data['message']
)
feedback.save()
Beispiel für Datenspeicherung mit forms.ModelForm
form = PostForm(request.POST)
if form.is_valid():
form.save()
5. Welche Form sollte man wählen?
- Aufgaben mit Modellbezug: Wenn direkte Interaktion mit der Datenbank erforderlich ist, ist die Verwendung von
forms.ModelForm
sinnvoll. - Aufgaben ohne Modellbezug: Verwenden Sie
forms.Form
, wenn unabhängige Datenvalidierung oder Benutzereingabeverarbeitung erforderlich ist.
Fazit
forms.Form
und forms.ModelForm
sind zwei leistungsstarke Werkzeuge von Django zur Verarbeitung von Dateneingaben und -validierung. Da die beiden Klassen unterschiedliche Verwendungszwecke und Eigenschaften haben, ist es wichtig, das passende Formular für die jeweilige Situation zu wählen. Im nächsten Artikel werden wir die Formularfelder und Widgets genauer betrachten.
Add a New Comment