• ↑↓ pour naviguer
  • pour ouvrir
  • pour sélectionner
  • ⌘ ⌥ ↵ pour ouvrir dans un panneau
  • ←→ pour naviguer
  • esc pour rejeter
⌘ '
raccourcis clavier

Formal Definition

Django Forms (django.forms.Form) provide a declarative way to define validation logic, rendering, and data cleaning for user input, while ModelForms (django.forms.ModelForm) automatically generate form fields from a model’s field definitions, handling model instance creation and updates through form.save().

Explanation

Forms solve the problem of safely handling user input — validating, sanitizing, and converting raw HTTP POST data into structured Python objects. A Form declares fields with validators and widgets; on submission, form.is_valid() runs field cleaning (clean_<field>()), form-level cleaning (clean()), and returns cleaned data. ModelForms extend this by mapping form fields to model fields, enabling form.save() to create or update model instances atomically.

How It Works

  1. Form defined — Class with field instances (CharField, EmailField, ModelChoiceField, etc.)
  2. GET request — View instantiates empty form; template renders {{ form.as_p }} or manual {{ field }}
  3. POST request — View instantiates Form(request.POST) (and request.FILES for uploads)
  4. Validation runsis_valid() calls full_clean() → field clean()clean_<field>()clean()
  5. Cleaned dataform.cleaned_data dict available if valid
  6. Save/Model saveform.save() creates/updates model (ModelForm) or custom logic (Form)

Visual Explanation

forms_modelforms FormClass class BookForm(ModelForm):    class Meta:        model = Book        fields = ['title', 'author'] GETView GET: form = BookForm() render(template, {'form': form}) FormClass->GETView 1. Instantiate Template {{ form.as_p }} → <input name='title'> <select name='author'> GETView->Template 2. Render POSTView POST: form = BookForm(request.POST) if form.is_valid():    book = form.save() Template->POSTView 3. Submit POST Validation full_clean() 1. Field clean() 2. clean_title() 3. clean() POSTView->Validation 4. Validate ModelSave form.save() → Book.objects.create(...) OR book.save() Validation->ModelSave 5. Save if valid

Semantic Network

semantic_forms_modelforms THIS Forms / ModelForms PRE1 Models / ORM THIS--PRE1 built from PRE2 Field Classes THIS--PRE2 built from PRE3 Widget Classes THIS--PRE3 built from PRE4 Validator Classes THIS--PRE4 built from OUT1 Form Validation THIS--OUT1 builds into OUT2 ModelForm Save Logic THIS--OUT2 builds into OUT3 Form Rendering THIS--OUT3 builds into OUT4 Formsets (Multiple Forms) THIS--OUT4 builds into OUT5 File Uploads THIS--OUT5 builds into CON1 WTForms (Flask) THIS--CON1 contrasts with CON2 Pydantic (FastAPI) THIS--CON2 contrasts with REL1 CSRF Protection THIS--REL1 related REL2 Template Tags THIS--REL2 related

Key Properties

  • Field types: CharField, IntegerField, EmailField, ChoiceField, ModelChoiceField, ModelMultipleChoiceField, FileField, ImageField, DateTimeField, BooleanField
  • Widgets control rendering: TextInput, Textarea, Select, CheckboxSelectMultiple, HiddenInput, DateTimeInput — customize HTML attributes
  • Validation layers: Field clean() (type/format) → clean_<field>() (field-specific) → clean() (cross-field) → cleaned_data
  • ModelForm Meta: model, fields/exclude, widgets, labels, help_texts, error_messages, field_classes
  • save(commit=False): Returns unsaved instance for pre-save modification (e.g., set author=request.user)

Connections

  • Built from: ORM — ModelForm introspects model fields
  • Built from: Form Fields — Field definitions and validation
  • Built from: Widgets — HTML rendering customization
  • Built from: Validators — Reusable validation logic
  • Builds into: Form Validation — Multi-layer cleaning pipeline
  • Builds into: ModelForm Save Logicsave(), save(commit=False)
  • Builds into: Form Renderingas_p, as_table, as_ul, manual {{ field }}
  • Builds into: Formsets — Multiple forms on one page
  • Builds into: File UploadsFileField, ImageField, request.FILES
  • Contrasts with: WTForms — Flask’s form library, similar but separate
  • Contrasts with: Pydantic — FastAPI’s validation, type-hint based, no HTML rendering
  • Related: CSRF Protection{% csrf_token %} required for POST forms
  • Related: Form Template Tags{{ form.errors }}, {{ field.label_tag }}

Edge Cases & Gotchas

  • clean() vs clean_<field>(): clean() runs after all field cleaning; cleaned_data may be incomplete if field errors exist
  • ModelForm exclude vs fields: fields = '__all__' includes future model fields (security risk); explicit fields preferred
  • save(commit=False): Must call instance.save() manually; M2M needs form.save_m2m() after
  • File uploads: Need enctype="multipart/form-data" on <form>; request.FILES separate from request.POST
  • Formset management form: Hidden TOTAL_FORMS, INITIAL_FORMS required; can_delete=True adds DELETE checkbox