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

Comparison between forms.Form and forms.ModelForm in Django, highlighting differences like Model Association and Data Handling

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

  1. Datenverarbeitung ohne Modellbindung: Beispiel: Suchformular, Anmeldeformular, Passwort zurücksetzen Formular.
Suchformular-Beispiel
class SearchForm(forms.Form):
    query = forms.CharField(max_length=100, label="Suche")
  1. 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

  1. Modellobjekte erstellen und aktualisieren: Beispiel: Blogbeiträge, Kommentare, Benutzerprofile bearbeiten.
Kommentarformular-Beispiel
class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['author', 'text']
  1. 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 von cleaned_data.
  • forms.ModelForm: Automatisches Speichern der Daten mit der save()-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?

  1. Aufgaben mit Modellbezug: Wenn direkte Interaktion mit der Datenbank erforderlich ist, ist die Verwendung von forms.ModelForm sinnvoll.
  2. 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.