Episode 26 of 32
Model Forms
Create forms from models automatically — use Django ModelForm to generate a form for creating articles without defining fields manually.
Model Forms
Instead of manually defining form fields, ModelForm generates a form directly from a model. It handles validation and saving to the database.
Creating a ModelForm
# articles/forms.py
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'slug', 'body', 'thumb']
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control'}),
'body': forms.Textarea(attrs={'class': 'form-control'}),
}
Using the Form in a View
# articles/views.py
from .forms import ArticleForm
from django.contrib.auth.decorators import login_required
@login_required(login_url='accounts:login')
def article_create(request):
if request.method == 'POST':
form = ArticleForm(request.POST, request.FILES)
if form.is_valid():
instance = form.save(commit=False)
instance.author = request.user
instance.save()
return redirect('articles:list')
else:
form = ArticleForm()
return render(request, 'articles/article_create.html', {
'form': form
})
Key Concepts
| Concept | Purpose |
|---|---|
fields | Which model fields to include in the form |
widgets | Customize HTML attributes for each field |
request.FILES | Required when the form includes file uploads |
commit=False | Creates instance without saving — lets you set extra fields first |
The Template
<!-- templates/articles/article_create.html -->
{% extends 'base_layout.html' %}
{% block content %}
<h2>Create Article</h2>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Publish</button>
</form>
{% endblock %}
enctype="multipart/form-data" is required for file uploads (the thumbnail image).
Key Takeaways
- ModelForm generates form fields from a model — no manual field definitions
commit=Falselets you set fields (like author) before saving- Include
request.FILESandenctype="multipart/form-data"for file uploads - ModelForm handles validation based on model field constraints