Ваше первое Django-приложение, часть 2

В статье "Writing your first Django app, part 2" автор продолжает обучающий курс по созданию приложения с помощью Django для тех, кто это делает впервые.

Начнём с того места, где мы остановились в первой части. Мы продолжаем приложение Web-опроса и сосредоточимся теперь на автоматически-генерируемом интерфейсе администратора Django-сайта.

Философия

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

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

Интерфейс администратора сайта создан для менеджеров, поэтому посетителям сайта не следует им пользоваться. 

 

Активирование интерфейса администратора сайта

Интерфейс администратора сайта Django не активирован по умолчанию - это опция. Для его активации сделайте следующие три шага:

  • запустите python manage.py syncdb. Если Вы добавляете новое приложение в INSTALLED_APPS, то после этого необходимо обновить таблицы баз данных.

  • измените файл mysite/urls.py и разкомментируйте строки, на которые администратору указывают, что их необходимо разкомментировать. Это файл - URLconf; мы рассмотрим его в следующем руководстве. Пока, все, что нам нужно знать о нём - это то, что он отображает соответствие корней URL  приложениям. В итоге ваш файл urls.py должен выглядеть следующим образом:
Метод добавления URL интерфейса администратора, изменённого в Django 1.1.

 

from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
# Example:
# (r'^mysite/', include('mysite.foo.urls')),

# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),

# Uncomment the next line to enable the admin:
(r'^admin/', include(admin.site.urls)),
)

(Строки в полужирном начертании необходимо разкомментировать.)

Запуск сервера разработки

Давайте запустим сервер разработки и исследуем интерфейс администратора сайта.

Вспомним 1 часть руководства и запустим сервер разработки следующим образом:

Python manage.py runserver

 Теперь, откройте Web-браузер и зайдите в "/admin/" на своём локальном домене, например, http://127.0.0.1:8000/admin/. Вы увидите следующее окно:

Django admin login screen
 

Вход в интерфейс администратора сайта

Теперь заходим. (Если Вы помните, мы создали учётную запись суперпользователя в первой части руководства? Если Вы не создали или забыли пароль, то Вы можете создать другую.)Вы должны увидеть главную страницу Django:

Django admin index page

Вы должны увидеть другие типы доступного для редактирования контента, включая группы, пользователей и сайты. Они поставляются с Django по умолчанию.

 

Сделаем приложение опроса редактируемым в интерфейсе администратора

Но где наше приложение опроса? Оно не отображено на главной странице.

Надо сделать лишь одну вещь - сообщить интерфейсу администратора, что объекты Poll имеют интерфейс администратора. Чтобы это сделать, создайте файл admin.py в каталоге polls и измените его следующим образом:

from mysite.polls.models import Poll
from django.contrib import admin

admin.site.register(Poll)

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

 

Узнаем о функциональных возможностях интерфейса администратора

Теперь, когда мы зарегистрировали Poll, Django знает, что он должен быть отображён на главной странице:

Django admin index page, now with polls displayed

Нажмите кнопку "Polls". Теперь Вы находитесь на странице "change list" для опросов. Эта страница отображает все опросы в базе данных и позволяет Вам выбрать необходимый для внесения изменений. Здесь есть опрос "What's up? ", который мы создали в первой части руководства:

Polls change list page

Нажмите на опрос "What's up? ", чтобы внести в него изменения:

Editing form for poll object

NB:

  • Форма автоматически генерируется из модели Poll.

  • Различные типы полей в модели (DateTimeField, CharField) соответствуют определённому виджету HTML-ввода. Каждый тип поля знает, как отображаться в интерфейсе администратора Django.

  • Каждый DateTimeField получает свободные ярлыки JavaScript. "Даты" получают ярлык "Today" и всплывающий календарь, а "Время" получает ярлык "Now" и удобное выпадающее окно, которое содержит часто вводимые значения времени.

Нижняя часть страницы предоставляет пару опций:

  • сохранить - сохраняет изменения и возвращается к странице change-list для этого типа объекта.

  • сохранить и продолжить редактирование - сохраняет изменения и перезагружает страницу интерфейса администратора для этого объекта.

  • сохранить и добавить другой - сохраняет изменения и загружает пустую форму для создания объекта, данного типа.

  • удалить - отображает страницу подтверждения удаления.

Измените "Date published", щёлкнув по кнопке "Today" и "Now". Затем щёлкните по кнопке "Сохранить и продолжить редактирование. После этого нажмите кнопку "History" в верхнем правом углу. Вы увидите страницу, отображающую список всех изменений, которым подвергся данный объект через интерфейс администратора Django, отображая время и имя пользователя человека, который внёс изменения:

History page for poll object
 

Настройка формы интерфейса администратора

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

Давайте посмотрим как это работает, изменив порядок полей в форме редактирования. Замените строку admin.site.register(Poll) на:

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

admin.site.register(Poll, PollAdmin)

Далее в том же стиле - создадим модель объекта интерфейса администратора и передадим его как второй аргумент в admin.site.register() - в любое время, когда необходимо изменить настройки интерфейс администратора для объекта.

Это изменение расположит поле "Publication date" перед полем "Question":

Fields have been reordered

С наличием всего двух полей это не выглядит так впечатляюще, но для форм с большим количеством полей, выбор порядка является важным и практичным.

К тому же, при наличии форм с множеством полей, у вас может возникнуть желание разделить форму на fieldsets:

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

admin.site.register(Poll, PollAdmin)

Первый элемент каждого кортежа в fieldsets является заголовком 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: "объекты Choice должны редактироваться на странице интерфейса администратора Poll. По умолчанию, достаточно выводить 3 строчки. "

Загрузите страницу "Add poll", чтобы узнать как это выглядит:

 

Настройка change list

Теперь, когда страница интерфейса администратора Poll выглядит хорошо, давайте настроим страницу  "change list" - ту, которая отображает все опросы в системе.

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

Polls change list page2

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

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

Просто в качестве хорошего тона, давайте также добавим метод was_published_today из 1 части данного руководства:

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

Теперь страница change list выглядит следующим образом:

Polls change list page, updated

Вы можете кликнуть на заголовки колонок для сортировки по ним - кроме заголовка was_published_today потому что сортировка по пользовательским методам не поддерживается. Также обратите внимание, что заголовок столбца was_published_today по умолчанию, совпадает с  названием метода (подчеркивания заменяются на пробелы). Но Вы можете изменить это, задав методу (в файле models.py) атрибут short_description:

def was_published_today(self):
    return self.pub_date.date() == datetime.date.today()
was_published_today.short_description = 'Published today?'

Давайте ещё немного улучшим страницу Poll change: Фильтры. Добавьте следующую строку к PollAdmin:

list_filter = ['pub_date']

Это добавит панель "Фильтр", что позволит людям фильтровать change list по полю pub_date:

Polls change list page, updated2

Тип отображаемого фильтра зависит от типа поля, по которому Вы фильтруете. Поскольку pub_date является DateTimeField, то Django предоставляет по умолчанию следующие варианты фильтров для DateTimeFields: "Any date," "Today," "Past 7 days," "This month," и "This year".

Это хорошо. Давайте добавим теперь возможность поиска:

search_fields = ['question']

Это добавит строку поиска наверху change list. Когда кто - то вводит информацию для поиска, Django ищет это в поле question. Вы можете использовать столько полей, сколько Вы захотите - но из-за того, что для поиска используется LIKE не загружайте слишком сильно вашу базу данных.

И наконец, из-за того, что Poll-объекты имеют даты, было бы удобно разделить их по датам. Добавьте следующую строку:

date_hierarchy = 'pub_date'

Это добавит иерархическое расположение по времени наверху страницы change list. На верхнем уровне, отображаются все доступные годы. Затем вниз идут месяцы, и в конце дни.

Обратите также внимание на то, что change lists дают вам постраничную навигацию. По умолчанию отображается 50 элементов на странице. Постраничная навигация Change-list, строки поиска, фильтры, упорядочивание по дате и названию столбца, всё вместе работает так, как надо.

 

Настройка внешнего вида интерфейса администратора

 

Очевидно, что надпись "Django administration" в верхней части каждой страницы интерфейса администратора выглядит смешно.

Это легко исправить, используя систему шаблонов Django. Интерфейс администратора Django написан на Django и использует собственную систему шаблонов Django)

Откройте файл настройки параметров (mysite/settings.py) и взгляните на TEMPLATE_DIRS. TEMPLATE_DIRS является кортежем каталогов файловой системы для проверки при загрузке шаблонов Django. Он также является путём поиска файлов.

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

TEMPLATE_DIRS = (
    "/home/my_username/mytemplates", # Change this to your own directory.
)

Теперь скопируйте шаблон 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.

Затем, отредактируйте файл и замените стандартный текст Django собственным низванием на свой вкус.

Этот файл шаблона содержит много такого текста, как {% block branding %} и {{ title }}. Теги ``{% и {{ являются частью языка шаблона Django. Когда Django выполняет admin/base_site.html, то этот язык шаблона будет влиять на создание конечной HTML-страницы. Не волнуйтесь, если Вы не поняли, что делать с шаблоном на данном этапе, мы рассмотрим эту тему позже в 3 части.

Обратите внимание, что стандартные шаблоны интерфейса администратора Django могут быть заменены. Чтобы заменить шаблон, просто проделайте то же самое, что и с base_site.html - скопируйте его из стандартного каталога в свой и внесите изменения.

Проницательные читатели спросят: Но если TEMPLATE_DIRS пуст по умолчанию, то как тогда Django находил заданные по умолчанию шаблоны интерфейса администратора? Ответ один: по умолчанию, Django автоматически ищет подкаталог templates/ в каждом пакете приложений, для использования в качестве резерва. Для получения полной информации см. template loader documentation.

Настройка стартовой страницы интерфейса администратора

У вас может возникнуть желание изменить стартовую страницу интерфейса администратора Django.

По умолчанию, она отображает все приложения в INSTALLED_APPS которые были зарегистрированы в качестве приложений интерфейса администратора, в алфавитном порядке. У вас может возникнуть желание внести существенные изменения в расположение страницы. В конце концов, стартовая страница - это наверное самая важная страница интерфейса администратора, и она должна быть удобна для пользования.

Шаблон для настройки  admin/index.html. (Сделайте то же, что и с admin/base_site.html iв предыдущем разделе - скопируйте его из главного каталога в свой каталог шаблона.) Во время изменения файла, Вы увидите, что он использует переменную шаблона app_list. В этой переменной есть информация обо всех установленных приложениях Django. Вместо этого, Вы можете жестко закодировать ссылки на страницы интерфейса администратора так, как вам удобно. Еще раз повторюсь, не беспокойтесь, если Вы не всё можете понять в языке шаблона - мы рассмотрим это подробнее в части 3.

 

Оригинал статьи на  www.docs.djangoproject.com

Перевод хостинг КОМТЕТ komtet.ru

Вам также может помочь