Take the 2-minute tour ×

In the same way that you can give fields and models verbose names that appear in the Django admin, can you give an app a custom name?

share|improve this question
This ticket would address this: code.djangoproject.com/ticket/3591 . Unfortunately, it doesn't seem as it would be integrated into Django anytime soon... –  Benjamin Wohlwend Aug 12 '09 at 6:58
add comment

9 Answers

up vote 38 down vote accepted

You can give your application a custom name by defining app_label in your model definition. But as django builds the admin page it will hash models by their app_label, so if you want them to appear in one application, you have to define this name in all models of your application.

class MyModel(models.Model):
    class Meta:
        app_label = 'My APP name'
share|improve this answer
Better than nothing ... –  Natim Jul 8 '10 at 9:49
This sucks, but works. –  rmh Oct 14 '10 at 10:48
I was having trouble with this in the admin. So much depends on the app_label that when I started changing the name, it broke that stuff. –  Joe J Jan 26 '11 at 18:34
I know, I ended up writing a templatag which had a dict with app_url:app_name binding. –  Frost.baka Jan 27 '11 at 8:20
Note, this is NOT the same as a verbose name, in the sense that it only effects what's shown to the user. It's the literal string used to name the table in the database, which requires a schema migration if you're changing an existing model. –  Cerin Apr 11 '12 at 16:14
show 1 more comment

If you have more than one model in the app just create a model with the Meta information and create subclasses of that class for all your models.

class MyAppModel(models.Model):
    class Meta:
        app_label = 'My App Label'
        abstract = True

class Category(MyAppModel):
     name = models.CharField(max_length=50)
share|improve this answer
add comment

Give them a verbose_name property.

Don't get your hopes up. You will also need to copy the index view from django.contrib.admin.sites into your own ProjectAdminSite view and include it in your own custom admin instance:

class ProjectAdminSite(AdminSite):
    def index(self, request, extra_context=None):
        copied stuff here...

admin.site = ProjectAdminSite()

then tweak the copied view so that it uses your verbose_name property as the label for the app.

I did it by adding something a bit like this to the copied view:

            app_name = model_admin.verbose_name
        except AttributeError:
            app_name = app_label

While you are tweaking the index view why not add an 'order' property too.

share|improve this answer
add comment

Well I started an app called todo and have now decided I want it to be named Tasks. The problem is that I already have data within my table so my work around was as follows. Placed into the models.py:

    class Meta:
       app_label = 'Tasks'
       db_table = 'mytodo_todo'

Hope it helps.

share|improve this answer
add comment

No, but you can copy admin template and define app name there.

share|improve this answer
add comment

For Django 1.4 (not yet released, but trunk is pretty stable), you can use the following method. It relies on the fact that AdminSite now returns a TemplateResponse, which you can alter before it is rendered.

Here, we do a small bit of monkey patching to insert our behaviour, which can be avoided if you use a custom AdminSite subclass.

from functools import wraps
def rename_app_list(func):
    m = {'Sites': 'Web sites',
         'Your_app_label': 'Nicer app label',

    def _wrapper(*args, **kwargs):
        response = func(*args, **kwargs)
        app_list = response.context_data.get('app_list')

        if app_list is not None:
            for a in app_list:
                name = a['name']
                a['name'] = m.get(name, name)
        title = response.context_data.get('title')
        if title is not None:
            app_label = title.split(' ')[0]
            if app_label in m:
                response.context_data['title'] = "%s administration" % m[app_label]
        return response
    return _wrapper

admin.site.__class__.index = rename_app_list(admin.site.__class__.index)
admin.site.__class__.app_index = rename_app_list(admin.site.__class__.app_index)

This fixes the index and the app_index views. It doesn't fix the bread crumbs in all other admin views.

share|improve this answer
add comment

I'm using django-admin-tools for that.

share|improve this answer
Thanks for your help. I can able to do it perfectly. –  Siva Mar 22 '11 at 19:42
Care to elaborate on how one uses django-admin-tools to actually change the displayed app name? –  Nathan Osman Aug 1 '13 at 1:37
Just don't use AppList, use ModelList for building dashboards. [rant] I think that using app names (and relying on them) anywhere in UI is a horrible decision, because the whole "django app" concept is meant to organize source code, not to organize the UI. Django apps have absolutely nothing to do with UI. App names can be used to quickly get some default UI representation, but if you start customizing the admin then thinking about app names is not a good way forward. [/rant] –  Mikhail Korobov Aug 1 '13 at 10:12
The problem with django-admin-tools that I found is that it fixes only the dashbord. The rest of the internal pages continue with the wrong name (breadcrumbs, etc). Or I just don't know how to do that? Any suggestion? –  Nurdagniriel Oct 30 '13 at 17:26
Yes, django-admin-tools doesn't fix breadcrumbs, and unfortunately django admin uses app names there. To get this level of customization you'll need to either override some templates (and maybe even some admin methods) or use one of the hacks to actually change the app name. –  Mikhail Korobov Oct 30 '13 at 18:50
add comment

If you already have existing tables using the old app name, and you don't want to migrate them, then just set the app_label on a proxy of the original model.

class MyOldModel(models.Model):

class MyNewModel(MyOldModel):
    class Meta:
        proxy = True
        app_label = 'New APP name'
        verbose_name = MyOldModel._meta.verbose_name

Then you just have to change this in your admin.py:

#admin.site.register(MyOldModel, MyOldModelAdmin)
admin.site.register(MyNewModel, MyOldModelAdmin)

Be aware that the url will be /admin/NewAPPname/mynewmodel/ so you might just want to make sure that the class name for the new model looks as close to the old model as possible.

share|improve this answer
add comment

You can't give apps a custom name (at the moment at least; I believe this is going to be addressed at some point), but you can give your fields a "display name" by passing the verbose_name keyword argument to your fields (this is also conveniently the first positonal argument).

So, you can do either:

address = models.CharField(blank=False, max_length=250, verbose_name='Address (Line 1)')


address = models.CharField('Address (Line 1)', blank=False, max_length=250)

…and the admin will display these "pretty" versions instead.

I'm not sure if you're saying you know this already or not, but if not, you can give your models custom names too, also with the verbose_name (and verbose_name_plural) properties in the model's Meta class, like:

class ModelName(models.Model):
    # your model definition here

    class Meta:
        verbose_name = 'verbose model name'
        verbose_name_plural = 'plural verbose model name'
share|improve this answer
add comment

Your Answer


