Essential session storage is required to sign in. Optional analytics remain off unless you allow them.
Build a small Django app (a blog, a task tracker, a bookmark manager). Requirements: define at least TWO models with fields AND a ForeignKey relationship, then run makemigrations + migrate; register them in the admin with a customized ModelAdmin (list_display, list_filter); write at least one FUNCTION-BASED VIEW that queries via the ORM and renders a TEMPLATE using {% extends %} inheritance and a {% for %} loop; wire it in urls.py with a NAMED url (path() + a name=) and build the URL in the template with {% url %}; and include one POST form with {% csrf_token %}. Keep DEBUG on only for local dev. Explain how the request flows URL -> view -> model -> template.
Two+ models with a ForeignKey; makemigrations + migrate run cleanly; the view reads data through the ORM (objects.all/filter).
A view renders a template using {% extends %} inheritance and a loop; urls.py maps a NAMED url resolved with {% url %}; the request flows end to end.
Models registered with a customized ModelAdmin (list_display); at least one POST form includes {% csrf_token %}.
Use this README structure to make the work reviewable.
DevPath fetches a read-only, size-capped snapshot. Submitted code is never executed.
# A CRUD app powered by the Django admin
## Goal
Build a small Django app (a blog, a task tracker, a bookmark manager). Requirements: define at least TWO models with fields AND a ForeignKey relationship, then run makemigrations + migrate; register them in the admin with a customized ModelAdmin (list_display, list_filter); write at least one FUNCTION-BASED VIEW that queries via the ORM and renders a TEMPLATE using {% extends %} inheritance and a {% for %} loop; wire it in urls.py with a NAMED url (path() + a name=) and build the URL in the template with {% url %}; and include one POST form with {% csrf_token %}. Keep DEBUG on only for local dev. Explain how the request flows URL -> view -> model -> template.
## Acceptance criteria
- [ ] Models & migrations: Two+ models with a ForeignKey; makemigrations + migrate run cleanly; the view reads data through the ORM (objects.all/filter).
- [ ] MVT wiring: A view renders a template using {% extends %} inheritance and a loop; urls.py maps a NAMED url resolved with {% url %}; the request flows end to end.
- [ ] Admin & CSRF: Models registered with a customized ModelAdmin (list_display); at least one POST form includes {% csrf_token %}.
## Verification
- [ ] Document installation and run commands.
- [ ] Record automated checks and their exact commands.
- [ ] Add representative output, screenshots, or a short demo where useful.
- [ ] Confirm failure paths and known constraints.
## Decision log
### Decision title
- Context:
- Choice:
- Alternatives considered:
- Tradeoffs:
## Evidence
- Link each rubric criterion to the file, test, or artifact that demonstrates it.
## Known limitations
- List what is intentionally out of scope and what should be improved next.