A flat theme for Django admin interface. Modern, fresh, simple.

  • By elky
  • Last update: Sep 22, 2022
  • Comments: 16

Django Flat Theme

django-flat-theme is included as part of Django from version 1.9! 🎉

Please use this app if your project is powered by an older Django version.


django-flat-theme brings fresh air to the default Django Admin interface which hasn't changed in 10 years, since the very first version of Django framework. This theme makes the UI modern and clean.

This app overrides the default admin's CSS. All the changes only involve CSS: colors, margins, sizes and icons; nothing major is changed.


Install via pip: pip install django-flat-theme

  1. Put flat app in your INSTALLED_APPS before django.contrib.admin:

  2. Enjoy!


Works properly in Django 1.5+.


This theme uses the Roboto font which is under Apache 2.0 licence.


Tested in:

  • Internet Explorer 7+ (IE8 and less doesn't support SVG so icons are not displayed)
  • Firefox 30+ (Windows, Ubuntu, OS X)
  • Chrome 35+ (Windows, Ubuntu, OS X)
  • Safari 8 (OS X)

Screenshot Examples

Login page




List of objects


New object





  • 1

    Mobile responsive?

    This is really awesome! The flat design made me think the CSS made everything mobile-responsive out of the box, but it turns out that's still yet to be implemented :confused: Is responsiveness on the roadmap?

  • 2

    Change icons to something modern

    Have a desire to replace the current icons in the interface (with something like Font Awesome). But I see that there is an additional branch with the same purpose. There is a sense in completion, or the author has completed and will soon be merging?

  • 3

    Custom colors and logo

    Hi, thanks for this theme, I think it is one of the best and modern Django admin themes available.

    Generally for each client I add a custom logo and I set 2 custom colors, a light and a dark one.

    It would very nice having the possibility to customize these 3 things using settings.py or by providing an small admin panel for the theme.

    What do you think about it?

  • 4

    django-admin-tools menu compatibility?

    It would be great if this theme could (eventually) be compatible with the drop-down menus provided by django-admin-tools.

    I understand you can't support compatibility with every other admin modification plugin, but my impression is that django-admin-tools in particular is mature and widely used.


    Thanks for a great package.

  • 5

    Action select box height is to small

    The current select box that is displayed above a list for selecting an action is to small to display the text properly.

    Screenshot with german locale: Screen

  • 6

    Not working at production stage

    Hi, for some reason django-flat-theme it is not working at production stage, it is strange because "flat" it is setted in base.py before django.contrib.admin, and the same file it is used by production and dev. Any ideas ??? Thanks a lot !

  • 7

    Declare that django-flat-theme supports Python 3

    caniusepython3.com reports it as unsupported, while it obviously works. It would be nice to add the trove classifiers to setup.py. See https://github.com/brettcannon/caniusepython3#how-do-you-tell-if-a-project-has-been-ported-to-python-3 for details or just steal it from Django.

  • 8

    ValueError: bad marshal data (unknown type code)

    Please, do not use in the MANIFEST.in instructions that's like this:

    recursive-include flat *

    In this case, all files will be included into the package distribution. For example, such as the files: *.pyc, .DS_Store. Because of this, when I installed this package with the following command:

    easy_install django-flat-theme

    I got an error:

    Traceback (most recent call last):
      File "/home/.../setuptools-18.2-py3.4.egg/setuptools/command/bdist_egg.py", 
    line 391, in scan_module
    ValueError: bad marshal data (unknown type code)

    It is best to explicitly specify the file extensions to be included in the distribution. For example:

    recursive-include flat *.py *.html *.css *.js
  • 9

    Great job!

    Hey Elky,

    I'm just opening this issue to let you know that I really like your job and am thankful for what you've done! I hope it'll make into Django 1.9 and everyone will enjoy your work! Молодец, так держать!

  • 10

    Layout problem on multiple element by line admin rendering


    I'm having (with my French up to date Firefox Linux & Windows) issues on rendering.

    I may be cause of the problem as I added chosen widget…

    [edit] I am the cause of the problem, my widget need to disable overflow hidden in form row and it does it automatically… and if I use !important to overflow hidden, my widget don't work properly as it can't pop from the line…

    I agree it's not really your issue but I don't really know how to handle my MixIn which works pretty well in classic admin.


    Do you think of a work around for advanced admin user injecting widget relying on classic overflowing style?

  • 11

    "/static/admin/img/tooltag-arrowright.png" is a gif in <1.7

    Can't use django-flat-theme atm, since the above file doesn't exist as a .png in 1.6:

    sudo: python manage.py fasts3collectstatic --ignore *.scss --noinput
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/fonts/Roboto-Bold-webfont.woff'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/fonts/LICENSE.txt'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/fonts/Roboto-Light-webfont.woff'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/fonts/Roboto-Medium-webfont.woff'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/fonts/Roboto-Regular-webfont.woff'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/fonts/README.txt'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/css/base.css'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/css/override.css'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/css/forms.css'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/css/fonts.css'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/css/widgets.css'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/css/changelists.css'
    out: Copying '/usr/local/lib/python2.7/dist-packages/flat/static/admin/css/login.css'
    out: Post-processed 'admin/fonts/Roboto-Bold-webfont.woff' as 'admin/fonts/Roboto-Bold-webfont.2ad99072841e.woff'
    out: Post-processed 'admin/fonts/LICENSE.txt' as 'admin/fonts/LICENSE.d273d63619c9.txt'
    out: Post-processed 'admin/fonts/Roboto-Light-webfont.woff' as 'admin/fonts/Roboto-Light-webfont.b446c2399bb6.woff'
    out: Post-processed 'admin/fonts/Roboto-Medium-webfont.woff' as 'admin/fonts/Roboto-Medium-webfont.7c2fef29499b.woff'
    out: Post-processed 'admin/fonts/Roboto-Regular-webfont.woff' as 'admin/fonts/Roboto-Regular-webfont.ec39515ae8c6.woff'
    out: Post-processed 'admin/fonts/README.txt' as 'admin/fonts/README.19c10ee52bb0.txt'
    out: Post-processing 'admin/css/base.css' failed!
    out: Traceback (most recent call last):
    out:   File "manage.py", line 10, in <module>
    out:     execute_from_command_line(sys.argv)
    out:   File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    out:     utility.execute()
    out:   File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 392, in execute
    out:     self.fetch_command(subcommand).run_from_argv(self.argv)
    out:   File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 242, in run_from_argv
    out:     self.execute(*args, **options.__dict__)
    out:   File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 285, in execute
    out:     output = self.handle(*args, **options)
    out:   File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 415, in handle
    out:     return self.handle_noargs(**options)
    out:   File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 173, in handle_noargs
    out:     collected = self.collect()
    out:   File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 125, in collect
    out:     raise processed
    out: ValueError: The file 'admin/img/tooltag-arrowright.png' could not be found with <founders_base.backends.CachedStaticS3BotoStorage object at 0x7fdd9771df90>.
  • 12

    Ensure INSTALLED_APPS sanity for flat app according to Django version

    Closes https://github.com/elky/django-flat-theme/issues/36

    This solution is similar to https://github.com/fabiocaccamo/django-admin-interface/blob/master/admin_interface/settings.py

  • 13

    [Suggestion]: Fail loudly when trying to install on Django>=1.9

    Hi there!

    I was wondering if it would be nice force an installation error when Django>=1.9 is present.

    This may (or may not, IDK) be a rare scenario but take my case as an example: I just upgraded a project from Django 1.8 to Django 1.11... and my Django admin interface was... well... misbehaving. It took me a considerable amount of time to understand that that was being caused by conflicts between (in my case) this and that.

    If you guys agree this is a good idea I'll be happy to implement the changes, if needed.

  • 14

    Providing `base_site.html` breaks compatibility with end-user projects.

    As mentioned here: https://github.com/elky/django-flat-theme/commit/49c9b059de3398577417234399a94b5a6ece4c30

    This change probably breaks compatibility with any existing project that defines their own admin/base_site.html template, which I believe is the recommended way for people to extend the Django admin template without duplicating base.html.

    Changing the order of INSTALLED_APPS won't help. It's either our base_site.html or yours.

    Is there another way you can implement django-flat-theme without adding the flat-theme class directly to the body tag in this template? Maybe django-flat-theme can just live without it? Or you could duplicate the base.html template. That would be ideal for people wanting to use django-flat-theme with their own projects, as it would remain more of a drop in replacement.

  • 15

    Display of fields on the same line

    From: https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets

    As with the fields option, to display multiple fields on the same line, wrap those fields in their own tuple.

    As you can see the labels are closer to the preceeding input than they are to their own: https://drive.google.com/file/d/0B_afp8i9IOxeNDZlcWZ5ZDdvTTg/view?usp=drivesdk

    I think this was also an issue with the old admin css but now might be a good time to address it.

    I'm not sure what the best fix is. However - it should be possible to target form-rows with multiple fields using a variant of this technique: http://stackoverflow.com/questions/8720931/can-css-detect-the-number-of-children-an-element-has

    I suggest either:

    1. close the gap in this case
    2. add some form of divider between fields
  • 16

    some ideas

    I have spent sometime with the flat theme, great work. Here's some thoughts that might be worth a thought

    • port the css to compass
    • replace all common styles with variables defined in a _variables.scss so there's a straight forward way to compile the flat theme with your own preferences
    • replace icons with fontawesome or halflings, e.g.
    .related-lookup:before {
      font-family: "FontAwesome";
      content: "\f002";

    schermafbeelding 2015-05-18 om 22 39 46

    • some common mixins might be nice, e.g. btn-group

    schermafbeelding 2015-05-18 om 22 39 37

    I'm not sure where django's admin style is heading, but if it is eager to include something like flat into core, it would be nice to have something more flexible than another (yet slick :+1: ) set of css files :-)