Updated October 27, 2023 to include additional quotes and commentary.
While talking with people at Djangocon US, one question kept coming up: “why is the Django admin so ‘ugly’?”. I’m paraphrasing here, so pardon the click-bait title, but the question came in many forms. Why does the Django admin have a “dated” UI? Why has the Django admin not changed much in all these years? Why is the Django admin missing <insert feature>?
Being an old-timer (my first Djangocon was 2012, a century ago in web dev time) I thought I had the answer: the Django admin is “ugly” to discourage you from giving it to clients or end-users.
But thankfully, there are better people than me who walk this earth. One such person is Janelle who asked: “can I get a source for that?”. Challenge accepted. Not wanting to let Janelle down, I searched far and wide, across the vast expanse of conference rooms and laptop screens, to seek the wisdom of Django maintainers. The teacher becomes the student.
The Django admin is not ugly, rather, no effort was made to make it a beautiful end-user tool.
Ken Whitesell, longtime Django user and ever-present face in the Django community, has worked with Django since version 1.2. Ken very rightfully corrected my question: the Django admin is not ugly, rather, no effort was made to make it a beautiful end-user tool. Ken then pointed out that the answer to my question was front-and-center in the Django documentation itself:
The admin’s recommended use is limited to an organization’s internal management tool. It’s not intended for building your entire front end around.
— From https://docs.djangoproject.com/en/4.2/ref/contrib/admin/
Ken also pointed out that this exact question has come up time and time again in the Django forum. See for yourself.
So that answers the how; now I wanted the why. Why is this the intended use case for the Django admin?
The Django admin was built for Phil.
— Jacob Kaplan-Moss
Jacob Kaplan-Moss, co-creator of Django, gave me the most beautifully literal answer: “The Django admin was built for Phil”, referring to Phil Cauthon, then-editor of Lawrence.com weekly newspaper, one of the first Django sites ever built. Since Django was originally built for the newspaper, the admin was used by internal staff who were trusted to know how to use it. “If something was edited or messed up in the admin, you could walk over to someone’s desk and ask ‘why did you do that?’”, Jacob recounts of the original Django admin workflow.
Both Ken and Jacob came to a consensus, which sort of aligned with my answer as well. The Django admin is more about organizational administration and trust. You have administrative/organizational/political control over who uses the admin and what they do with it. There is an implicit level of trust in your staff. You don’t need to invest the time and effort into making it a customer-facing tool used by people who are not familiar with your product.
Even in the 0.9x days we used to have a image that said “Admin: it’s not your app”.
— Curtis Maloney
Curtis Maloney, known as FunkyBob online, recalls the earliest days of Django: “Even in the 0.9x days we used to have a image that said ‘Admin: it’s not your app’”. Curtis and I both agree that the Django admin is a great database tool, but should be treated as such. As Curtis put it, “encouraging people to build their own management interface, and treat admin as a DB admin tool, has saved a lot of people pain... the effort to customise it grows far faster than the payoffs.”
All that being said, the Django admin is still a tool used by humans, so we should continue making improvements to make it accessible. My colleague Thibaud Colas gave a fantastic talk about this (a recording of the talk will be available soon).
Lastly, if you find the need to give the Django admin to your customers or end-users, consider checking out the Wagtail ModelAdmin, which is nearly a drop-in replacement (and runs alongside the existing Django admin) with the benefit of tremendous accessibility, fine-grained control, and a beautiful UX built for non-technical end-users.
P.S. Thank you to Janelle who challenged me on this by asking for a source. I learned a thing or two in the process. It’s a great reminder to challenge your own understanding; and another reason why spending time with the wonderful folks in our community can really refresh your mind.