bhylu.com

Advertisements

Django Form Validation

Some rules involve more than one field. A form’s clean method can reject a combination that individually valid fields would otherwise allow.

How it works

The workshop form compares remaining seats with capacity. Each field can be a valid integer while their combination is inconsistent. Calling super().clean preserves ordinary validation; use data.get because a field with an earlier error may be absent from cleaned_data. Return the cleaned mapping and attach a non-field error when the rule belongs to the combination rather than one value. Database constraints remain necessary for writes outside this form.

Run in the supplied local Django project

This lesson uses Django 5.2.18 LTS with Python 3.12. Download the source downloader and run node download-project.mjs http://127.0.0.1:8000 with Node 22 while previewing locally. It creates a new bhylu-django-lab folder and refuses to overwrite an existing one. After deployment, the default base is bhylu.com; until then use your local preview URL.

Inside that new folder, create a virtual environment, install requirements.txt and run the complete lesson file shown below. Every lesson creates a fresh in-memory SQLite database and temporary upload storage. It does not edit the interactive lab’s db.sqlite3 or Bhylu’s database. The visible listing below is the lesson’s core code; its complete downloaded file includes the shared bootstrap.

Django does not run in Bhylu’s current browser playground. No Apache, MySQL or global PHP configuration change is needed. See the setup lesson for the full project and commands.

Example

Run .venv\Scripts\python.exe lessons\validation.py from the downloaded project root. Download the complete lesson file; keep it under lessons/. The project’s shared models, forms, views and fixture are prerequisites, not a hidden online runtime.

lessons/validation.py — core code

from workshops.forms import WorkshopForm
form = WorkshopForm({"title":"Cable care", "slug":"cable-care", "venue":Venue.objects.first().pk,
    "starts_at":"2026-11-10 14:00", "capacity":3, "remaining":4})
print(form.is_valid())
print(bool(form.non_field_errors()))

Expected result

False
True

The example fails because four remaining seats cannot fit a capacity of three. The form reports a useful rule before any save occurs. Test equal values and a missing field as well as this invalid combination.

Use Django’s versioned official documentation for exact API contracts and the deployment checklist before a separate release.

Advertisements