# Django Baton: replacing the default Django admin with a Bootstrap 5 interface

> Django Baton is an MIT licensed Python package that replaces the standard Django admin with a responsive Bootstrap 5 interface and adds a set of AI assisted editing features, configurable list filters and theming. The trade-offs are a hard Django and Baton version pairing, a hosted AI service behind a subscription key, and a project whose published version numbers do not line up.

**otto-torino/django-baton** — A cool, modern and responsive django admin application based on bootstrap 5 that brings AI to the Django admin - https://baton.sqrt64.it/

- Repository: https://github.com/otto-torino/django-baton
- Stars: 997 · Forks: 98
- Language: Python
- License: MIT
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/otto-torino-django-baton

## A replacement admin built on Bootstrap 5, not a theme for the old one

Django Baton is a Python package that turns the standard Django admin into a different interface, one built on Bootstrap 5 with Google's newer symbol icon font and jQuery for DOM manipulation, with all assets compiled into a single JavaScript file. The stated design principle is to minimize overriding Django templates, with styling done primarily through CSS and JavaScript reserved for dynamic behaviour. That principle is the whole pitch. The default admin is built around templates you are expected to copy and edit, which is a reasonable trade for a framework and an expensive one for a project that wants a different look, and Baton moves the customisation into CSS variables and a small set of documented extension points instead. The audience is teams whose admin is a product surface rather than a back office, and the packaged features are aimed at that audience: a dict configurable sidebar menu, a global search field with autocomplete, list filters with text, dropdown and multiple choice variants, tabbed fieldsets and inlines, a fixed submit row, collapsable stacked inlines, lazy loading for uploaded images, and toast notifications for admin messages. Italian and Farsi translations are included.

## The Django and Baton version pairing is fixed in three steps

The compatibility rules are stated as a matrix rather than left to inference. For Django 5.x and above you use Baton 5.0 or later. For Django versions from 2.1 up to but not including 5.x you use Baton 4.x. For older Django 1.x versions you install django-baton==1.13.2, which is a pin to a specific historical release. The 5.x line is where the disruptive change sits: it brought a complete visual redesign and replaced FontAwesome with the newer Google symbol icon font, and the project publishes a migration guide for moving from v4 to v5 in its wiki. That is the cost of the pairing rule. An upgrade of the framework is not a small dependency bump, it is a coordinated move of both packages plus a pass over the theme, because icons and layout change underneath the CSS. The packaging metadata in the repository lists Django 4.2, 5.0, 5.1, 5.2, 6.0 and 6.1 as supported framework versions and requires Python 3.10 or newer.

## The AI features run through a Baton subscription, not your own key

The AI functions arrived in the 4.0 line and were extended in 4.2, and they are the feature most likely to decide whether you want this package. Automatic translations integrate with django-modeltranslation and generate translated content for the fields you mark. Text summarization condenses long content for a summary field, and text corrections improve wording as you type. Tag suggestions propose values for a ManyToManyField tag field based on the other fields in the form. Image vision generates alt attribute descriptions, which arrived as computer vision support in 4.2.0 and were integrated into the BatonAiImageField in 4.2.1, and image generation uses GPT Image. The catch is stated in the feature list itself: these capabilities require a Baton subscription key. So the AI part is not a local model and not a key you supply, it is a service the project operates, and the boundary is meaningful for teams with data residency or privacy requirements. The hosted live demo at the project site is logged in with the demo and demo credentials if you want to look before installing.

## Installing it: one pip command and a specific app ordering

The installation is short. The package is on PyPI and installs with:

```bash
pip install django-baton
```

To work from the latest development version instead, the documentation suggests cloning the repository into your project. The one detail that is easy to get wrong comes next: in settings.py, baton has to be added before django.contrib.admin in INSTALLED_APPS, and baton.autodiscover has to be added at the very end of the list. That ordering is not cosmetic, because Baton relies on autodiscovery to attach its own behaviour to the admin pages, and putting the app in the wrong place silently produces an admin that looks like the default one. After that, the project is configured in the usual Django way, and the documentation for the remaining settings lives on the project's readthedocs site rather than in the README. The package declares one runtime dependency, requests, and it ships a py.typed marker, which tells type checkers that the library is typed.

## Themes change through CSS variables, not a JavaScript rebuild

The theming story is the part of the package that most reduces long term friction. Since the 4.0 release the project supports themes through CSS variables, and most theme changes no longer require recompiling the JavaScript application. That is a real shift in the cost model: a visual change used to mean running the asset build, and now it means editing a variable. Deeper changes are still possible by recompiling the provided JavaScript application, so the escape hatch exists for anyone who needs it. Ready made themes live in a separate repository, django-baton-themes, which the documentation points to for inspiration and reuse. The frontend stack in total is Bootstrap 5 for styling and responsiveness, the Google symbol font for icons, and jQuery for DOM manipulation, with the compiled output bundled into one JavaScript file for delivery. The result is an admin that is a self contained asset bundle rather than a set of files you pull from a CDN, which matters for deployments with a strict content policy.

## Extension points for developers: includes, row attributes and filter modes

Underneath the styling, the package exposes a documented set of hooks, and the README table of contents is essentially a list of them. Includes let you inject custom templates into changelist pages and change form pages, and there are separate hooks for changelist filters, which lets a filter render its own markup rather than relying on the default. Dynamic row attributes add custom HTML attributes, including classes, data attributes and titles, to changelist rows or individual cells. Form tabs turn fieldsets and inlines into a tabbed interface, and collapsible stacked inlines keep long related object lists out of the way. The list filters have two optional behaviours worth knowing about: a modal display for the filter panel, and a form mode that applies several filters at once instead of one at a time. There are also quality of life details such as a confirmation prompt for unsaved changes, a loading indicator for multipart form uploads, and Gravatar support for user identification. Signals, JS utilities, JS translations and a page detection helper are documented as well, and the repository ships a testapp directory and a tasks.py file for running the test suite during development.

## Typing is enforced, but the published version numbers disagree

The repository is typed more strictly than most Django packages, and the configuration makes that explicit. The mypy section targets Python 3.10, loads the mypy_django_plugin, and sets disallow_untyped_defs and disallow_incomplete_defs so that every function and method in the package carries annotations, with a comment in the configuration saying the point is that future edits do not silently drop coverage. Analysis is limited to the real modules of the library, excluding the vendored static assets, the generated migrations, the development testapp and the build output, and django-stubs are wired to a dedicated settings module rather than to the test application. That is a well maintained type setup. The version numbers are where the documentation is less tidy. The packaging file declares version 5.9.3, while the most recent GitHub releases listed are 5.1.2 on 2026-02-22, 5.1.1 on 2026-02-11 and 5.1.0 on 2026-01-24, and the last push to the repository was on 2026-10-14. Whichever number you end up installing, check it against the compatibility matrix before deploying, and read the LICENSE file for the MIT terms the project points to.

## Conclusion

Django Baton suits teams that want a modern, responsive admin for end users and staff rather than for developers, and that are willing to accept a hosted AI dependency for the assisted editing features. It does not suit a project pinned to Django 1.x, a team that refuses to send content to a third party service, or anyone who needs the admin to stay a thin layer over Django templates. Verify three things before you adopt it: that your Django version maps to the Baton major you need, since Django 5.x and above requires Baton 5.0 or later, that the AI features you want are covered by the Baton subscription you are buying, and which version you are actually installing, because the packaging metadata and the published release list do not match. The last push was on 2026-10-14, the most recent GitHub release is 5.1.2 from 2026-02-22, and the licence is MIT.

## FAQ

### Which Django versions does Django Baton support?

For Django 5.x and above you need Baton 5.0 or later, for Django 2.1 up to but not including 5.x you need Baton 4.x, and for Django 1.x you install django-baton==1.13.2. The packaging metadata lists Django 4.2, 5.0, 5.1, 5.2, 6.0 and 6.1, and Python 3.10 or newer is required.

### Do the AI features in Django Baton work without a paid account?

The feature list states that the AI capabilities require a Baton subscription key, and they cover automatic translations, summarization, text correction, tag suggestions, image alt text generation and image generation with GPT Image. The rest of the admin does not depend on them.

### How do I change the look of the Django Baton admin?

Since the 4.0 release theming works through CSS variables, and most theme changes no longer require recompiling the JavaScript application. For deeper changes you can still recompile the provided JavaScript, and ready made themes are published in the django-baton-themes repository.

### What has to change when moving from Baton 4 to Baton 5?

The 5.x line brought a complete visual redesign and replaced FontAwesome with the newer Google symbol icon font. The project publishes a migration guide from v4 to v5 in the wiki for that upgrade.

## Sources

- [Issues](https://github.com/otto-torino/django-baton/issues)
- [License: MIT](https://github.com/otto-torino/django-baton/blob/master/LICENSE)
- [otto-torino/django-baton on GitHub](https://github.com/otto-torino/django-baton)
- [README](https://github.com/otto-torino/django-baton/blob/master/README.md)
- [Releases](https://github.com/otto-torino/django-baton/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/otto-torino-django-baton
