Начинаем работу с Django — изменение админки

Django admin — мощное средство, позволяющее упростить создание административной части сайта. Django автоматически создает нужные формы для создания и редактирования данных на сайте. При этом у вас может появится как минимум две причины для изменения админки — сделать ее визуально красивее и изменить формат представления данных.

Для модификации внешнего вида вы вольны использовать свои шаблоны. Также есть готовые приложения, предназначенные для этой цели — такие как Grapelli и Django Suit. Можно прочесть про их использование в статье «Улучшение админки Django«.

Также разработчики Django предоставили возможность сделать работу с объектами в базе более удобной, меняя формы и формат представляемых админкой данных.

Изменение формы добавления новых объектов

Разработчики Django выполнили за нас огромный объем работы. Вам достаточно зарегистрировать вашу модель, чтобы автоматически были созданы формы для добавления новых объектов. В случае с моделью Poll из примера регистрация выполняется командой admin.site.register(Poll), Однако часто вам понадобится изменить вид и работу административной части сайта. В том, что касается ваших моделей, это выполняется параметрами при регистрации объекта.

Давайте для примера переопределим порядок полей на форме редактирования.

Замените строку admin.site.register(Poll) таким кодом:

class PollAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question']

admin.site.register(Poll, PollAdmin)

Все достаточно просто. Вы создаете новый класс для представления объекта в админке и затем передаете его вторым аргументом при регистрации модели.

В приведенном примере дата публикации теперь будет идти перед полем вопроса.

Fields have been reordered

В случае двух полей это не особо принципиально, но когда нужно заполнять объекты с большим количеством данных, интуитивный порядок может значительно повысить удобство работы с ними.

Если мы говорим о формах с сотнями полей для ввода, вы вероятно захотите разбить их, используя fieldsets:

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

admin.site.register(Poll, PollAdmin)

Первый элемент в каждом кортеже — заголовок fieldset. Вот как это будет выглядеть:

Form has fieldsets now

Вы можете назначить произвольные HTML классы любому fieldset. Django предлагает класс "collapse" который отобразит выбранный fieldset изначально свернутым. Это удобно, когда данный блок содержит данные, которые редко заполняются:

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]

Fieldset is initially collapsed

Изменение списка объектов в админке Django

Теперь страничка админки для вашей модели выглядит лучше. Давайте внесем еще несколько изменений в страницу, отображающую список объектов.

Вот как он выглядит изначально:

Polls change list page

По-умолчанию, Django отображает значение функции str() каждого объекта. Иногда удобнее если мы можем отобразить определенные поля. Для этого используйте list_display — кортеж с именами полей, которые в админке будут отображены в качестве столбцов на странице со списком объектов.

class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date')

Вы также можете добавить любой определенный вами метод.

class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date', 'was_published_recently')

Теперь список наших объектов будет выглядеть в виде таблицы:

Polls change list page, updated

Вы можете кликнуть на заголовке столбца, чтобы отсортировать таблицу по значениям в данном столбце. Исключением являются столбцы, содержащие вывод определенных вами методов — сортировка по этим значениям не поддерживается. Также отметьте, что по-умолчанию заголовок столбца, отображающего результаты метода was_published_recently — имя метода, в котором символы подчеркивания заменены на пробелы.

Вы можете изменить поведение по-умолчанию, добавив к методу несколько атрибутов — например так:

class Poll(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

Добавление фильтров к списку объектов

Отредактируйте файл admin.py,чтобы добавить фильтрацию. Добавьте к классу PollAdmin такую строку:

list_filter = ['pub_date']

Это добавит боковую колонку с названием“Filter”, которая позволит людям отфильтровать значения таблицы по дате публикации в поле pub_date:

Polls change list page, updated

Вид отображаемого фильтра зависит от типа данных. Поскольку pub_date использует тип DateTimeField, Django добавит к фильтру варианты “Any date,” “Today,” “Past 7 days,” “This month,” “This year.”

Добавление поиска объектов в админке

Добавление к классу PollAdmin строки предоставит пользователям возможность поиска:

search_fields = ['question']

Теперь вверху списка появится поле для поиска. Когда кто-то будет вводить туда искомые значения, Django будет искать их в поле question. Вы можете задать так много полей для поиска как вам нужно.

Отображение дат

Поскольку объект Poll хранит даты, будет удобно добавить им иерархию. Добавьте строку:

date_hierarchy = 'pub_date'

Теперь наверху списка появится отображение всех лет, в которых происходила публикация. Когда вы выберете год, появятся месяцы и далее дни.

Изменение внешнего вида админки

Стандартный вариант админки Django не является образцом удобства для пользователей. Например надпись “Django administration” в верхней части каждой страницы не несет никакой полезной нагрузки — это просто кусок текста.

Подобные вещи легко изменить, используя систему шаблонов Django. Админская часть сайта на Django построена на самой Django и полностью поддерживает ее систему шаблонов.

Изменение шаблонов проекта

Создайте каталог templates в каталоге вашего проекта. Шаблоны могут находится везде, где Django может получить к ним доступ. Однако размещение шаблонов в каталоге проекта — это удобное соглашение, которое не заставит вас ломать голову в их поисках позднее.

Откройте файл с настройками проекта (settings.py) и добавьте параметр TEMPLATE_DIRS:

TEMPLATE_DIRS = (
    '/path/to/mysite/templates', # Change this to your own directory.
)

Теперь скопируйте шаблон admin/base_site.html из каталога с исходниками Django admin (django/contrib/admin/templates) в подкаталог admin, размещенный по указанному в TEMPLATE_DIRS пути. Например, если вы указали в TEMPLATE_DIRS '/path/to/mysite/templates', то скопируйте django/contrib/admin/templates/admin/base_site.html в /path/to/mysite/templates/admin/base_site.html.

Если вы не можете найти исходники Django, выполните команду:

python -c "
import sys
sys.path = sys.path[1:]
import django
print(django.__path__)"

Теперь, замените в шаблоне текст на название вашего сайта или то, что вы сочтете нужным.

Любой из стандартных шаблонов Django может быть переписан. Чтобы заменить шаблон, скопируйте его также в каталог с шаблонами вашего проекта и делайте изменения.

Учтите, что загрузчик шаблонов Django ,будет использовать первый шаблон, найденный им в файловой системе. Поэтому если вы переопределяете шаблоны, используемые административной частью сайта в вашем приложении, убедитесь, что приложение идет в списке INSTALLED_APPS раньше, чем django.contrib.admin.

Изменение основной страницы админки

Похожим образов выполняется и изменение базовой страницы админской части сайта. Стандартная индексная страница админки Django отображает все приложения из INSTALLED_APPS, которые были зарегистрированы в админке, в алфавитном порядке.

Вполне вероятно, что вы захотите изменить это — ведь главная страница очень важна и должна быть удобной в использовании. Для этого вам понадобится изменить файл admin/index.html. Перенесите его из исходников Django в ваш проект и измените. Редактируя файл, вы увидите переменную, с названием app_list. Эта переменная содержит каждое установленное в Django приложение. Вместо использования этого списка вы можете закодировать на главной странице ссылки на любые объекты, которые сочтете нужными для удобной работы.

Когда стоит применять админку Django

Django admin не очень подходит для обычных посетителей сайта. Как правило, для авторизованных посетителей, не являющихся администраторами сайта, целесообразнее создавать свои шаблоны для работы с нужной им информацией.

Использование django admin при этом вы можете оставить для администратора сайта, которому нужен простой интерфейс и возможность отредактировать любой объект в базе данных.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *