In Django zijn er twee belangrijke formulierklassen, forms.Form
en forms.ModelForm
. In dit artikel leggen we de verschillen tussen deze twee klassen uit en welke formulieren in welke situaties moeten worden gekozen op basis van hun gebruiksgevallen.
1. Overzicht van forms.Form
en forms.ModelForm

1.1 Wat is forms.Form
?
- Onafhankelijke formulierklasse: Werkt onafhankelijk van het Django-model en stelt je in staat om de gewenste gegevens handmatig te definiëren.
- Hoofddoel: Wordt gebruikt om gebruikersinvoer te valideren of gegevens te verwerken die niet direct aan een model zijn gekoppeld.
Voorbeeld: Gebruikersfeedbackformulier
from django import forms
class FeedbackForm(forms.Form):
name = forms.CharField(max_length=50, label="Je Naam")
email = forms.EmailField(label="Je E-mail")
message = forms.CharField(widget=forms.Textarea, label="Je Feedback")
1.2 Wat is forms.ModelForm
?
- Verbonden formulierklasse met een model: Heeft een directe relatie met het Django-model en automatiseert de interactie met de database.
- Hoofddoel: Wordt gebruikt om modelinstanties te creëren, bij te werken of om gegevens die in de database moeten worden opgeslagen, in te voeren.
Voorbeeld: Formulier voor het schrijven van een blogbericht
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
2. Vergelijking van belangrijke verschillen
Categorie | forms.Form | forms.ModelForm |
---|---|---|
Relatie met model | Onafhankelijk van het model | Direct gekoppeld aan het model |
Gegevensverwerking | Gegevens handmatig opslaan na validatie | Automatisch opslaan van gegevens (met form.save() methode) |
Manier van velddefiniëring | Alle velden expliciet definiëren | Velden van het model automatisch omzetten naar formulier velden |
Gebruikstoepassing | Onafhankelijke gegevensverwerking of gebruikersinvoerformulieren | Formulieren gerelateerd aan database-acties |
Flexibiliteit | Vrijheid om velden te definiëren | Afhankelijk van modelvelden |
3. Gebruikssituaties
3.1 Gebruikssituaties van forms.Form
- Verwerking van gegevens die niet aan een model zijn gekoppeld: Bijv. Zoekformulieren, inlogformulieren, wachtwoordherstelformulieren.
Voorbeeld van een zoekformulier
class SearchForm(forms.Form):
query = forms.CharField(max_length=100, label="Zoeken")
- Complexe gebruikersinvoer verwerking: Bijv. Wanneer invoervelden niet direct in het model worden opgeslagen.
Voorbeeld van een aanbiedingsformulier voor wachtwoord wijzigen
class PasswordChangeForm(forms.Form):
old_password = forms.CharField(widget=forms.PasswordInput, label="Oud Wachtwoord")
new_password = forms.CharField(widget=forms.PasswordInput, label="Nieuw Wachtwoord")
confirm_password = forms.CharField(widget=forms.PasswordInput, label="Bevestig Wachtwoord")
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("Wachtwoorden komen niet overeen.")
3.2 Gebruikssituaties van forms.ModelForm
- Modelobjecten creëren en bijwerken: Bijv. Blogberichten schrijven, opmerkingen schrijven, gebruikersprofiel aanpassen.
Voorbeeld van een opmerkingenformulier
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['author', 'text']
- Modelgebaseerde gegevensinvoer: Bijv. Wanneer bestaande gegevens worden aangepast of moeten worden opgeslagen in de database.
4. Vergelijking van formulierwerking
4.1 Gegevensvalidatie
forms.Form
: Handmatig velden en validatielogica definiëren.forms.ModelForm
: Automatisch de validatieregels gebruiken die zijn gedefinieerd voor modelvelden.
Voorbeeld: Validatie van modelvelden
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']
- Het
price
veld valideert automatisch de beperkingen die zijn gedefinieerd in het model (max_digits
,decimal_places
).
4.2 Gegevensopslag
forms.Form
: Gebruikcleaned_data
om gegevens te verwerken.forms.ModelForm
: Gegevens automatisch opslaan met desave()
methode.
Voorbeeld van gegevensopslag met 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()
Voorbeeld van gegevensopslag met forms.ModelForm
form = PostForm(request.POST)
if form.is_valid():
form.save()
5. Welke formulier moet je kiezen?
- Werkzaamheden gerelateerd aan een model: Als je direct met de database moet interageren, is het gebruik van
forms.ModelForm
geschikt. - Onafhankelijke werkzaamheden: Gebruik
forms.Form
als onafhankelijke gegevensvalidatie of verwerking van gebruikersinvoer nodig is.
Conclusie
forms.Form
en forms.ModelForm
zijn twee krachtige hulpmiddelen in Django voor het verwerken van gegevensinvoer en validatie. De twee klassen hebben verschillende doeleinden en kenmerken, dus het is belangrijk om het juiste formulier te kiezen voor de situatie. In het volgende artikel zullen we formuliervelden en widgets gedetailleerd bekijken.
댓글이 없습니다.