Djangos Formulare.Form vs Forms.ModelForm

75

Könnte mir jemand Ähnlichkeiten und Unterschiede von Djangos forms.Form& erklären forms.ModelForm?

Viet
quelle

Antworten:

119

Formulare, aus forms.Formdenen erstellt wurde, werden von Ihnen manuell konfiguriert. Verwenden Sie diese besser für Formulare, die nicht direkt mit Modellen interagieren. Zum Beispiel ein Kontaktformular oder ein Newsletter-Anmeldeformular, in dem Sie möglicherweise nicht unbedingt mit der Datenbank interagieren.

Wobei ein aus erstelltes Formular forms.ModelFormautomatisch erstellt wird und später von Ihnen optimiert werden kann. Die besten Beispiele stammen aus der hervorragenden Dokumentation auf der Django-Website.

forms.Form:
Dokumentation: Formularobjekte
Beispiel eines normalen Formulars, erstellt mit forms.Form:

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)

forms.ModelForm:
Dokumentation: Erstellen von Formularen aus Modellen
Direkt aus den Dokumenten:

Wenn Ihr Formular zum direkten Hinzufügen oder Bearbeiten eines Django-Modells verwendet werden soll, können Sie a verwenden ModelForm, um zu vermeiden, dass Ihre Modellbeschreibung dupliziert wird.

Beispiel eines Modellformulars, erstellt mit forms.Modelform:

from django.forms import ModelForm
from . import models

# Create the form class.
class ArticleForm(ModelForm):
    class Meta:
        model = models.Article

Dieses Formular hat automatisch dieselben Feldtypen wie das ArticleModell, aus dem es erstellt wurde.

Nathanismus
quelle
Vielen Dank! Darf ich fragen: Kann ich ModelForm in normalen Ansichten rendern, die sich nicht im Administratorbereich befinden? Das Formular kann in normalen Ansichten gerendert und verarbeitet werden, wenn Sie request.POST übergeben, um es zu initialisieren.
Viet
1
Ja. Das ist ihre beabsichtigte Verwendung. Die Administrationsformulare sind ein ganz anderes Tier und fallen nicht in den Rahmen dieser Frage. Gewöhnen Sie sich daran, sich auf die offizielle Dokumentation zu beziehen. Es ist hervorragend und wird Sie fast jedes Mal retten.
Nathanismus
13

Die Ähnlichkeiten bestehen darin, dass beide mithilfe von Widgets Sätze von Formulareingaben generieren und beide vom Browser gesendete Daten validieren. Die Unterschiede bestehen darin, dass ModelForm seine Felddefinition von einer angegebenen Modellklasse erhält und auch Methoden zum Speichern des zugrunde liegenden Modells in der Datenbank enthält.

Ignacio Vazquez-Abrams
quelle
8

So erweitere ich die integrierte UserCreationForm myapp / forms.py :

from django import forms
from django.contrib.auth.forms import UserCreationForm


class RegisterForm(UserCreationForm):

    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    email = forms.CharField(max_length=75)

    class Meta(UserCreationForm.Meta):
        fields = ('username','first_name','last_name', 'email')
Stephen Fuhry
quelle