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

ConceptPurpose
fieldsWhich model fields to include in the form
widgetsCustomize HTML attributes for each field
request.FILESRequired when the form includes file uploads
commit=FalseCreates 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=False lets you set fields (like author) before saving
  • Include request.FILES and enctype="multipart/form-data" for file uploads
  • ModelForm handles validation based on model field constraints