This document tracks the work to take django-adminlte4 from an excellent
static design port to a proper Django template — one that reuses
everything Django offers (admin, forms, auth, messages, pagination, tables)
rather than only reproducing AdminLTE's HTML.
Strong foundation
- Faithful AdminLTE 4 layout (Bootstrap 5.3, vanilla JS, Vite pipeline).
- Config-driven sidebar menu with a per-request filter pipeline
(
ActiveFilter/HrefFilter/GateFilter) — the standout Django feature. - ~33 django-components (Widget / Form / Tool families), well tested (~160 tests across components, menu, context processor, commands).
- Themed auth pages + working
LoginView/LogoutView/ register. - 50 showcase templates reproducing the official demo.
Reality check
- Page coverage is already ~1:1: AdminLTE's source has 74
.astrofiles but 26 are its documentation site; of the ~48 real demo pages the port reproduces all of them. - But ~49/50 demo pages are static markup with no Django data, and the project is not yet wired into Django's own subsystems. That integration layer is the gap below.
| Feature | Official demo | Port status | Action |
|---|---|---|---|
| Calendar | FullCalendar 6.1 | Static badges, no plugin | Wire FullCalendar (the one missing third-party lib) |
| Kanban | SortableJS lanes | Static cards, drag-drop not initialised | Wire SortableJS for kanban lanes |
| Date pickers / input masks | referenced | HTML5 inputs only | Add optional picker/mask init |
| Chat / File manager | static even upstream | static (parity) | leave as UI, or back with real views in CRUD demo |
ApexCharts, jsVectorMap, Tabulator, Quill, SortableJS, OverlayScrollbars are already wired.
Ranked by value. Every item is additive — it reuses the existing menu builder, filter pipeline, components, and auth shells.
| # | Capability | Today | Approach |
|---|---|---|---|
| 1 | Django admin theming | none — stock /admin/ |
templates/admin/base_site.html reusing master.html; adapt admin.site.get_app_list() into menu-builder dicts so the admin sidebar reuses GateFilter/ActiveFilter |
| 2 | Pre-built assets / Node optional | requires npm + Vite | vendor compiled CSS/JS in the wheel; pip install + collectstatic with zero Node; Vite becomes an opt-in [vite] extra |
| 3 | Whole-form rendering | per-field components only | adminlte crispy-forms template pack (extends crispy-bootstrap5); optional [crispy] extra |
| 4 | Built-in auth flow | password reset incomplete | ship full registration/ set on auth-master.html |
| 5 | Messages framework | middleware on, never rendered | partials/messages.html + recommended MESSAGE_TAGS; optional toast mode via adminlte_toast |
| 6 | Pagination | none | reusable partials/pagination.html from page_obj (shared by tables2 + admin) |
| 7 | Tables & filters | static / Tabulator only | django-tables2 adminlte.html template + django-filter styling; optional [tables] extra |
| 8 | Real CRUD demo | zero models/migrations | one small app (ModelForm + ListView/CreateView) proving tables2 + crispy + messages + pagination end-to-end |
| 9 | allauth theme | none | override allauth layouts/* + elements/* (~10 files); optional [allauth] extra |
| 10 | i18n / breadcrumbs | {% trans %} present, no .po; manual crumbs |
ship locale/; auto-derive admin breadcrumbs |
Keep the base install lean; gate every integration behind
pyproject.toml extras (crispy, tables, allauth, vite). Ship
pre-compiled assets so the install-and-go majority never needs Node; keep the
Vite stubs (adminlte_install) for customisers.
- Phase 1 — make it a Django product ✅
- Ship pre-built package assets (CSS/JS in
static/adminlte/dist/), Node optional viaADMINLTE["assets_mode"]="static" - Theme
django.contrib.adminreusing the menu builder (base.html chrome + base_site + login; sidebar auto-built from the admin app list) - Follow-up: Bootstrap-native admin
change_list/change_formcontent (native admin content currently renders inside the AdminLTE shell)
- Ship pre-built package assets (CSS/JS in
- Phase 2 — native forms & flows (in progress)
- messages partial (Django messages → AdminLTE alerts, level→class+icon) wired into the layout
- reusable pagination partial from
page_obj(preserves query string) - full
registration/auth templates (login, logout, password change + reset flow) on the auth shell - crispy-forms support via the
[crispy]extra —{% crispy form %}whole-form rendering, demoed on the CRUD form (AdminLTE 4 = Bootstrap 5, so the crispy-bootstrap5 pack renders natively; no redundant custom pack)
- Phase 3 — native data UI ✅
- django-tables2
adminlte.htmltheme (card wrapper + footer pagination) +[tables]extra - django-filter styled inline filter form (Bootstrap widgets)
- real CRUD demo app (
crud): Contact model, tables2 list + filter, ModelForm create/update, delete confirm,LoginRequiredMixin+ success messages; registered in the themed admin too
- django-tables2
- Phase 4 — fidelity & polish ✅
- FullCalendar bundled via Vite (self-hosted); Kanban drag-drop confirmed working
- Demo fully self-hosted — removed all CDN
<script>tags (charts/maps/tables/calendar/kanban now load from the bundle); dashboards' inline init wrapped inDOMContentLoaded - django-allauth theme —
[allauth]extra; AdminLTE-themed layouts (base/entrance/manage) + elements (fields/field/form/button/alert/h1/h2/p/hr/panel) - i18n — package message catalog + fully-translated Spanish (
es) locale, compiled and shipped - auto-breadcrumbs —
{% adminlte_breadcrumb %}fromrequest.path, default inpage.html