Mam wrażenie, że nawet z grappellim sprowadzi się to do grzebania w templates... Chociaż przynajmniej nie będzie problemu z widokami.
Na zwykłej instalacji Django można to również zrobić - trzeba odrobinę pogmerać w kodzie django.contrib.admin.
Konkretnie w:
django/contrib/admin/sites.py
Mamy metodę index() klasy AdminSite, a w niej taki kod:
# ............
else:
app_dict[app_label] = {
'name': app_label.title(),
'app_url': app_label + '/',
'has_module_perms': has_module_perms,
'models': [model_dict],
}
# ..............
Jak łatwo wywnioskować z urywka django/contrib/admin/templates/admin/index.html:
<caption><a href="{{ app.app_url }}" class="section">{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</a></caption>Pokazany wyżej atrybut name odpowiada za wyświetlaną nazwę aplikacji.
Co z tym zrobić? Pierwszy pomysł, jaki przychodzi mi do głowy:
1) Zdefiniować gdzieś (settings.py) dict mapujący app_label na verbose_app_name:
VERBOSE_APP_NAMES = {
"auth" : "Zarzadzanie uzytkownikami",
"sites" : "Instancje (nie wiem, czy to dobra nazwa...)",
}2) W django/contrib/admin/sites.py zmienić wspominaną metodę (okolice 375 linii):
# ............
else:
app_dict[app_label] = {
'name': getattr(settings, "VERBOSE_APP_NAMES", {} ).get( app_label ) or app_label.title(), # settings sa importowane na poczatku modulu
'app_url': app_label + '/',
'has_module_perms': has_module_perms,
'models': [model_dict],
}
# ..............
I już, powinno działać. Sam nie testowałem, ale możesz sprawdzić, nie powinno wybuchnąć

. Źródełka wzięte z Django 1.2.
Morał1
Django to "tylko python"; nie trzeba się bać modyfikacji i ingerencji w jego mechanizmy, jeśli tylko zachodzi taka potrzeba.
Moral2
Szukanie gotowych rozwiązań czasem jest typowym overkillem: grappelli jest fajny, ale ciężki, a żeby osiągnąć zamierzony przez Ciebie efekt wystarczy modyfikacja jednej linijki... - co dla mnie przynajmniej - jest mniejszym wysiłkiem, niż instalacja grappelli.
Moral3
Virtualenv! Jeśli każdy projekt ma własną instalacje Django, takie modyfikacje są bezpieczne. Co prawda zawsze warto użyć getattr() z wartością domyślną (i inne takie techniki), ale gdybyś o tym zapomniał - Virtualenv zabezpieczy pozostałe projekty przed niespodziewana wysypka.