Что такое админка в django и зачем ее кастомизировать, я думаю, вы уже знакомы. Для кастомизации админики есть множество инструментов, наподобие django-admin-tools и django-admin2. Но мы не будем рассматривать их в этой статье, а кастомизируем ее с помощью самой джанго. И увидим, что это не так трудно, как кажется:Итак, начнем с того, что админка django — это отдельное приложение, которое находится в django\contrib\admin. Исходники в сети можно увидеть на официальном сайте django.
С чего начнем? Как правило, чтобы кастомизировать админку django, надо унаследоваться от ModelAdmin.
Создадим admin.py в корне папки нашего приложения и напишем в нем следующие строки:
class NewAdmin(admin.ModelAdmin): pass
И мы можем добавить нашу модель для отображения вот так:
admin.site.register(Profile, NewAdmin)
Первый шаг положен. И первое, что, как правило, необходимо в админке — это изменение ее внешнего вида, например, названия сайта в заголовке.
Итак, идем в Lib\site-packages\django\contrib\admin\templates\admin
нашего виртуального окружения либо папки с Python. В моем случае — D:\django\hello\Lib\site-packages\django\contrib\admin\templates\admin.
Ищем там base_site.html и копируем его в папку с шаблонами своего проекта в подпапку admin: templates\admin
. Открываем его и видим следующую картину:
{% extends "admin/base.html" %} {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} {% block branding %} <h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1> {% endblock %} {% block nav-global %}{% endblock %}
И здесь вместо {{ site_header|default:_('Django administration') }}
мы можем вписать свой текст.
Все, готово. Если вы перезагрузите страницу, то увидите, что ничего не изменилось. А все дело в том, что загрузчик шаблонов джанго загрузит первый найденный шаблон в иерархии наследования NewAdmin. Соответственно, если у нас в settings.py приложение django.contrib.admin
стоит перед нашим приложением, то NewAdmin подхватит стандартный шаблон из D:\django\hello\Lib\site-packages\django\contrib\admin\templates\admin
. Спасибо за эту подсказку источнику, который, к сожалению, на момент написания статьи открывался только в мобильной версии. Надеюсь, пофиксят. Так ставим наше приложение вперед:
INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'main', 'django.contrib.admin', ]
Перезагружаем страницу и любуемся. Мы молодцы.
В целом — скажу вам по секрету — этот путь не является оптимальным для изменения названия сайта в админке. Да. Ведь можно было просто переопределить site_header дефолтного
AdminSite:
admin.site.site_header = 'My site'
Либо вовсе переопределить весь AdminSite:
class MyAdminSite(AdminSite): # Text to put at the end of each page's <title>. site_title = ugettext_lazy('My site admin') # Text to put in each page's <h1> (and above login form). site_header = ugettext_lazy('My administration') # Text to put at the top of the admin index page. index_title = ugettext_lazy('Site administration')
и указать его в маршрутизации:
from django.conf.urls import url from main.admin import admin_site from django.conf.urls import include from main import views urlpatterns = [ url(r'^', include('main.urls')), url(r'^admin/', admin_site.site.urls), ]
Спасибо посту Reto Aebersold. Но последний вариант из ссылки, на мой взгляд, в большинстве проектов слишком избыточный, и его следует использовать, когда вы столкнулись с необходимостью сделать несколько раздельных админок. А зачем нам танковая артиллерия здесь? Первый вариант с переопределением admin.site.site_header
— это то, что надо последовательного программирования. Но одно но… — это не то, что нам было нужно. Смысл нашего примера с переопределением шаблона — показать, как можно изменять пользовательский интерфейс админки джанго. И мы это сделали…
И это еще не все. Выше мы узнали как переопределять административные шаблоны. Теперь попробуем переопределить поля модели Profile для панели администратора. Изменим код нашего класса NewAdmin:
class NewAdmin(admin.ModelAdmin): #поля: fields = ['City','Sex','Age','Image']
И в админке джанго будет отобраться только эти поля, доступные для редактирования. На этом сделаем перерыв, но это еще не все. До новой встречи
Полезные ссылки по теме: раз, два, три, документация
от