Создаем свое первое приложение с Django, часть 2
Этот раздел – продолжение
первой части учебника. Мы продолжим разрабатывать приложение для голосования и создадим интерфейс администратора.
Активация интерфейса администратора
Интерфейс администратора не активирован по умолчанию. Что бы его активировать выполните следующие действия:
Запускаем сервер для разработки
Давайте запустим встроенный сервер для разработки и посмотрим на наш интерфейс администратора.
Напомним, что сервер для разработки запускается следующим образом:
Откроем “/admin/” локального домена в браузере – например,
http://127.0.0.1:8000/admin/. Вы должны увидеть страницу авторизации интерфейса администратора:
Заходим в интерфейс администратора
Теперь авторизируемся. (Вы создали суперпользователя в первой части учебника, помните? Если вы этого не сделали или забыли пароль,
создайте еще одного.) Вы должны увидеть главную страницу интерфейса администратора Django:

Вы должны увидеть несколько разделов включая группы, пользователей и сайты. Это встроенные основные приложения Django.
Добавим приложение голосования в интерфейс администратора
А где же наше приложение голосования? Оно не отображается в интерфейсе администратора.
Нам нужно указать, что объекты модели Poll могут редактироваться в интерфейсе администратора. Для этого создадим файл admin.py в каталоге polls, и отредактируем следующим образом:
Теперь перезапустим сервер. Обычно сервер самостоятельно перезапускается после изменений кода, но не при создании нового файла.
Изучим возможности интерфейса администратора
После регистрации модели
Poll Django отобразит ее на главной странице:

Нажмите “Polls”. Вы попали на страницу “списка объектов” для голосований. Эта страница содержим все объекты из базы данных и позволяет выбрать один из них для редактирования. Мы видим голосование “What’s up?”, которое создали в первой части учебника:

Нажмите “What’s up?” что бы отредактировать его:

Заметим:
В нижней части страницы мы видим несколько кнопок:
Если значение “Date published” не совпадает с временем создания объекта в первой части учебника, возможно вы не верно определили настройку
TIME_ZONE. Измените ее и перезагрузите страницу.
Измените “Date published” нажав “Today” и “Now”. Затем нажмите “Save and continue editing.” Теперь нажмите “History” в правом верхнем углу страницы. Вы увидите все изменения объекта сделанные через интерфейс администратора, время изменений и пользователя, который их сделал:
Добавления связанных объектов
Отлично, теперь модель
Poll имеет свою собственную страницу в интерфейсе администратора. Но
Poll содержит несколько
Choices, которые интерфейс администратора не отображает.
Пока что.
Есть два способа это сделать. Первый - зарегистрировать модель
Choice в интерфейсе администратора, так же как и
Poll. Это просто:
Теперь “Choices” отображается в интерфейсе администратора. Форма добавления варианта ответа выглядит следующим образом:

В этой форме поле “Poll” представлено
<select> с объектами
Poll из базы данных. Django знает, что поле
ForeignKey должно быть представлено как
<select>. В нашем случае можно выбрать только одно голосование.
Обратите внимание на ссылку “Add Another” возле поля “Poll.” Он будет добавлен для каждого поля
ForeignKey. При нажатии на “Add Another,” будет показано всплывающее окно с формой добавления голосования. Если вы добавите голосование и нажмете “Save,” Django сохранит объект в базу данных и выберет его в поле.
Но, на самом деле, это совсем не удобный способ добавлять варианты ответов для голосования. Было бы удобнее добавлять варианты ответов при добавлении голосования. Давайте сделаем это.
Уберите вызов
register() для модели
Choice. И отредактируйте код для регистрации
Poll в интерфейсе администратора:
Это говорит Django: “Варианты ответов редактируются на странице голосования. По умолчанию, покажите 3 формы для добавления вариантов ответа.”
Загрузите страницу добавления голосования и посмотрите как она выглядит, возможно вам понадобиться перегрузить сервер:

Это работает следующим образом: Есть три формы для добавления вариантов ответа – как определяет параметр
extra – и при каждой загрузке этой страницы будет три формы для добавления новых вариантов ответа.
Однако есть одна проблема. Эти формы занимают много места. Для таких случаев, Django предлагает другой вариант отображения, переопределите
ChoiceInline следующим образом:
С
TabularInline (вместо
StackedInline), формы для связанных объектов отображаются в более компактном табличном виде:
Настройка страницы списка объектов
Теперь, когда страница добавления/редактирования голосования выглядит хорошо, давай улучшим страницу отображения списка голосований.
Вот как она выглядит сейчас:

По умолчанию Django отображает результат выполнения
str() для каждого объекта. Но чаще всего хочется показывать список полей. Для этого используйте параметр
list_display, который является кортежем состоящим из названий полей модели:
Для примера давайте еще и добавим метод
was_published_recently из Части 1 учебника:
Теперь страница списка объектов
Poll выглядит следующим образом:

Вы можете нажать на заголовок колонки что бы отсортировать записи по полю – но не для
was_published_recently, так как сортировка по методу не поддерживается. Название колонки для
was_published_recently по умолчанию равно названию метода (нижние подчеркивание заменяется на пробелы), а значение равно строковому представлению результата выполнения метода.
Вы можете исправить это добавив несколько атрибутов (в
models.py) этому методу:
Отредактируем файл
admin.py снова и добавим на страницу Фильтры. Добавьте следующую строку в
PollAdmin:
Это добавляет “Фильтр” по полю
pub_date в боковой панели:

Тип фильтра зависит от типа поля. Так как
pub_date является
DateTimeField, Django отображает соответствующие варианты для фильтрации: “Any date,” “Today,” “Past 7 days,” “This month,” “This year.”
Теперь добавим поиск:
Это добавляет поле для поиска в верхней части страницы. При вводе запроса, Django будет искать по полю
question. Вы можете использовать любое количество полей – учтите что используется запрос
LIKE, так что постарайтесь не перегрузить вашу базу данных.
И наконец, так как объекты
Poll содержат поле даты, было бы удобно просматривать записи по дням, месяцам и тд. Добавьте следующую строку:
Это добавит иерархическую навигацию по дате в верхнюю часть страницы. Она содержит доступные года, месяца и дни.
Страница списка объектов так же содержит постраничное отображение. По умолчанию отображается 100 объектов на страницу.
Настраиваем внешний вид
“Django administration” в “шапке” страницы выглядит нелепо. Это просто замещающий текст.
Его очень легко заменить использую систему шаблонов Django. Интерфейс администратора работает благодаря Django и использует систему шаблонов Django.
Откройте файл настроек (напомним это
mysite/settings.py) и найдите настройку
TEMPLATE_DIRS.
TEMPLATE_DIRS являет собой кортеж путей к каталогам, который указывает Django будет искать шаблоны.
По умолчанию
TEMPLATE_DIRS пустая. Давайте добавим значением, что бы указать где находятся шаблоны:
Скопируйте шаблон
admin/base_site.html из каталога шаблонов приложения администратора Django (
django/contrib/admin/templates) в подкаталог
admin каталога указанного в настройке
TEMPLATE_DIRS. Например, если
TEMPLATE_DIRS содержит
'/home/my_username/mytemplates', скопируйте
django/contrib/admin/templates/admin/base_site.html в
/home/my_username/mytemplates/admin/base_site.html. Не забудьте про подкаталог
admin.
Отредактируйте файл и замените текст по умолчанию на название вашего сайта.
Этот шаблон содержит текст подобный
{% block branding %} и
{{ title }}. Теги
{% и
{{ – это части синтаксиса системы шаблонов Django. При выполнении шаблона
admin/base_site.html Django создаст HTML страницу. Не волнуйтесь если ничего не понимаете в этом – в шаблонах Django мы разберемся в Части 3.
Любой шаблон интерфейса администратора можно переопределить. Чтобы переопределить шаблон, сделайте тоже что и с
base_site.html – скопируйте его в каталог с шаблонами проекта и внесите изменения.
Внимательные читатели спросят: если
TEMPLATE_DIRS пустая по умолчанию, как Django находит шаблоны интерфейса администратора по умолчанию? Django пытается найти шаблон в подкаталоге
templates/ каждого приложении. Подробности смотрите в
разделе о загрузке шаблонов.
Настроим главную страницу
Возможно вам понадобиться настроить главную страницу интерфейса администратора.
По умолчанию она показывает все приложения в алфавитном порядке из настройки
INSTALLED_APPS, которые зарегистрированы в интерфейсе администратора. Главная страница очень важна и должна быть удобной.
Для главной страницы используется шаблон
admin/index.html. (Сделайте тоже что и с шаблоном
admin/base_site.html из раздела выше – скопируйте его из приложения Django в каталог шаблонов проекта.) Откройте файл и вы увидите использование переменной
app_list. Эта переменная содержи все отображаемые приложения. Вместо нее вы можете явно указать ссылки на нужные страницы. Опять же, не волнуйтесь что вы ничего не понимаете, шаблоны будут обсуждаться в Части 3.
Если вы освоили интерфейс администратора, переходите к
части 3 этого учебника.