Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Django_-_podrobnoe_rukovodstvo

.pdf
Скачиваний:
308
Добавлен:
01.03.2016
Размер:
4.88 Mб
Скачать

120 Глава 5. Модели

File “<console>”, line 1, in <module>

AttributeError: ‘Manager’ object has no attribute ‘delete’

Но заработает, если добавить вызов метода all():

>>> Publisher.objects.all().delete()

Если вы собираетесь удалить только часть данных, то метод all() необязателен, например:

>>> Publisher.objects.filter(country=’USA’).delete()

Что дальше?

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

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

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

6

Административный интерфейс Django

Административный интерфейс – необходимая составная часть некоторых веб-сайтов. Так называется веб-интерфейс, доступный только уполномоченным администраторам сайта и позволяющий добавлять, редактировать и удалять содержимое сайта. Вот несколько типичных примеров: интерфейс, с помощью которого вы добавляете записи в свой блог; интерфейс для модерирования сообщений, оставляемых пользователями; средства, с помощью которых заказчики добавляют новые пресс-релизы на сайт, который вы для них разработали.

Но создавать административные интерфейсы скучно. Разработка части сайта, обращенной к публике, – удовольствие, а административные интерфейсы похожи друг на друга как две капли воды. Нужно аутентифицировать пользователей, отображать формы и обрабатывать отправленные с их помощью данные, проверять введенные данные и т. д. Утомительная, повторяющаяся работа.

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

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

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

122

Глава 6. Административный интерфейс Django

Пакеты django.contrib

Автоматический административный интерфейс Django – часть более широкого набора приложений, именуемого django.contrib. В него входят разнообразные полезные дополнения к ядру каркаса. Можно считать django.contrib аналогом стандартной библиотеки Python – необязательная, принятая де-факто реализация часто встречающихся задач. Эти пакеты поставляются вместе с Django, чтобы избавить вас от необходимости изобретать велосипед при разработке собственных приложений.

Административный интерфейс – первый пакет из комплекта django. contrib, рассматриваемый в этой книге; строго говоря, он называется django.contrib.admin. В состав пакета django.contrib входят также сис­ тема аутентификации пользователей (django.contrib.auth), поддержка анонимных сеансов (django.contrib.sessions) и даже система­ сбора замечаний пользователей (django.contrib.comments). По мере обретения опыта работы с Django вы познакомитесь и с другими возможностями, имеющимися в django.contrib, а некоторые из них мы еще обсудим в главе 16. Пока достаточно знать, что Django поставляется в комплекте с полезными дополнительными модулями, которые обычно находятся в django. contrib.

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

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

Для начала внесите несколько изменений в файл параметров:

1.Добавьте ‘django.contrib.admin’ в параметр INSTALLED_APPS. (Порядок следования приложений в списке INSTALLED_APPS не имеет значения, но мы предпочитаем перечислять их по алфавиту, поскольку человеку так удобнее.)

2.Проверьте, что INSTALLED_APPS содержит строки ‘django.contrib.auth’, ‘django.contrib.contenttypes’ и ‘django.contrib.sessions’. Эти три пакета необходимы для работы административного интерфейса Django. (Если в процессе чтения вы следовали за нашими примерами, то по нашему совету вы закомментировали эти три строки в главе 5. Теперь раскомментируйте их.)

3.Проверьте, что параметр MIDDLEWARE_CLASSES содержит строки ‘django. middleware.common.CommonMiddleware’, ‘django.contrib.sessions.middleware. SessionMiddleware’ и ‘django.contrib.auth.middleware.AuthenticationMiddle­ ware’. (В главе 5 их тоже было предложено закомментировать, теперь пора раскомментировать.)

Работа с административным интерфейсом

123

Затем выполните команду python manage.py syncdb. При этом в базу данных будут добавлены таблицы, необходимые для работы административного интерфейса. Если в списке INSTALLED_APPS присутствует строка ‘django.contrib.auth’, то при первом выполнении команды syncdb система­ предложит создать учетную запись суперпользователя. Если этого не сделать сразу, то потом придется отдельно запускать сценарий python manage.py createsuperuser для создания административной учетной записи, без нее вы не сможете зайти в административный интерфейс. (Подвох: команда python manage.py createsuperuser доступна, только если в списке INSTALLED_APPS присутствует строка ‘django.contrib.auth’.)

Далее добавьте URL административного интерфейса в конфигурацию URL (напомним, она находится в файле urls.py). По умолчанию в файле urls.py, сгенерированном командой django-admin.py startproject, этот код закомментирован, и вам нужно всего лишь раскомментировать его. На всякий случай покажем фрагменты, которые должны присутствовать обязательно:

#Включить следующие инструкции импорта...

from django.contrib import admin admin.autodiscover()

#И этот шаблон­ URL...

urlpatterns = patterns(‘’,

# ...

(r’^admin/’, include(admin.site.urls)),

# ...

)

Покончив с настройкой, можно посмотреть на административный интерфейс Django в действии. Запустите сервер разработки (командой python manage.py runserver, как это делалось в предыдущих главах) и укажите в броузере адрес http://127.0.0.1:8000/admin/.

Работа с административным интерфейсом

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

Сначала вы увидите форму входа в систему­ (рис. 6.1).

Введите имя пользователя и пароль, указанные вами при добавлении суперпользователя. Если система­ не пускает, убедитесь, что создана учетная запись суперпользователя, – выполните команду python manage. py createsuperuser.

После успешного входа в систему­ вы увидите начальную страницу (рис. 6.2). На ней перечислены типы данных, которые можно редакти-

124

Глава 6. Административный интерфейс Django

 

 

 

 

 

 

Рис. 6.1. Форма входа в систему­

Рис. 6.2. Начальная страница административного интерфейса

Работа с административным интерфейсом

125

ровать в административном интерфейсе. Поскольку вы еще не активировали ни одну из своих моделей, то список невелик, в нем есть только группы (Groups) и пользователи (Users). Эти модели включаются в административный интерфейс по умолчанию.

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

Другие языки

Если ваш родной язык не английский и в броузере в качестве предпочтительного тоже задан иной язык, то можно быстро узнать, переведен ли административный интерфейс Django на ваш язык. Добавьте строчку ‘django.middleware.locale.LocaleMiddleware’ в параметр MIDDLEWARE_CLASSES после строчки ‘django.contrib.sessions. middleware.SessionMiddleware’.

Затем перезагрузите начальную страницу. Если перевод на ваш язык имеется, то все части интерфейса – ссылки Change Password (Изменить пароль) и Log Out (Выйти) сверху, ссылки Groups (Группы) и Users (Пользователи) в середине и прочие – предстанут на другом языке. В комплекте с Django поставляются переводы на десятки языков.

Дополнительные сведения об интернационализации Django см. в главе 19.

Щелкните на ссылке Change (Изменить) в строке Users (Пользователи), чтобы загрузить страницу со списком для изменения (рис. 6.3).

На этой странице отображаются все имеющиеся в базе данных пользователи; можете считать, что это облагороженный для веб аналог SQLзапроса SELECT * FROM auth_user. Если вы делали все так, как мы предлагали, то сейчас в списке будет только один пользователь, но по мере увеличения их количества вы оцените полезность функций фильтрации, сортировки и поиска. Варианты фильтрации находятся справа, для сортировки достаточно щелкнуть на заголовке столбца, а расположенное сверху поле поиска позволяет искать пользователя по имени.

Щелкнув на имени недавно созданного пользователя, вы увидите форму для редактирования данных о нем (рис. 6.4).

На этой странице можно изменить такие атрибуты учетной записи пользователя, как имя и фамилия, а также различные разрешения. (Отметим, что для изменения пароля пользователя следует щелкнуть на ссылке Change Password Form (Форма изменения пароля) под полем па-

126

Глава 6. Административный интерфейс Django

 

 

 

 

 

 

Рис. 6.3. Страница со списком для изменения пользователей

Рис. 6.4. Форма редактирования данных о пользователе

Работа с административным интерфейсом

127

роля, а не редактировать хеш-код пароля.) Еще следует отметить, что для редактирования полей разных типов применяются разные элементы управления: например для даты и времени – календарь, для булевских полей – флажок, для текстовых значений – простые поля ввода.

Чтобы удалить запись, щелкните на кнопке Delete (Удалить) в левом нижнем углу формы редактирования. При этом вы попадете на страницу подтверждения, где в некоторых случаях будут показаны зависимые объекты, которые тоже будут удалены. (Например, при удалении издательства удаляются и все изданные им книги!)

Чтобы добавить запись, щелкните на ссылке Add (Добавить) в соответствующем столбце таблицы на начальной странице административного интерфейса. В результате вы получите пустую форму редактирования, которую сможете заполнить.

Обратите внимание, что административный интерфейс проверяет введенные данные. Попробуйте оставить обязательное поле незаполненным или ввести некорректную дату; при попытке сохранить данные вы увидите сообщения об ошибках (рис. 6.5).

Рис. 6.5. Форма редактирования с сообщениями об ошибках

При редактировании существующего объекта в правом верхнем углу окна присутствует ссылка History (История). Все изменения, произведенные в административном интерфейсе, протоколируются, а эта ссылка позволяет ознакомиться с протоколом (рис. 6.6).

128

Глава 6. Административный интерфейс Django

 

 

 

 

 

 

Рис. 6.6. Страница истории изменений объекта

Добавление своих моделей в административный интерфейс

Одну важную вещь мы еще не сделали. Давайте включим свои собственные модели в административный интерфейс, чтобы для добавления, изменения и удаления объектов, хранящихся в наших таблицах, можно было воспользоваться средствами, так удобно реализованными в нем. Мы снова будем работать с проектом books из главы 5 и тремя определенными в нем моделями: Publisher, Author и Book.

В каталоге проекта books (mysite/books) создайте файл admin.py и добавьте в него такие строки:

from django.contrib import admin

from mysite.books.models import Publisher, Author, Book

admin.site.register(Publisher)

admin.site.register(Author)

admin.site.register(Book)

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

Затем перейдите на начальную страницу административного интерфейса в броузере (http://127.0.0.1:8000/admin/). Вы должны увидеть

Как работает административный интерфейс

129

раздел Books со ссылками Authors, Books и Publishers. (Чтобы изменения вступили в силу, возможно, понадобится остановить и снова запустить сервер разработки.)

Теперь у вас есть полнофункциональный административный интерфейс для всех трех моделей. Безо всяких проблем!

Поэкспериментируйте с добавлением и изменением записей, а заодно наполните базу тестовыми данными. Если вы выполняли приведенные в главе 5 упражнения по созданию объектов Publisher (и потом не удалили их), то должны увидеть эти записи на странице списка издательств.

Здесь стоит упомянуть о том, как в административном интерфейсе обрабатываются внешние ключи и отношения многие-ко-многим; те и другие встречаются в модели Book. Напомним, как выглядит эта модель:

class Book(models.Model):

title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField()

def __unicode__(self): return self.title

На странице Add Book (http://127.0.0.1:8000/admin/books/book/add/) поле publisher (типа ForeignKey) представлено раскрывающимся списком, а поле authors (типа ManyToManyField) – списком с возможностью множественного выбора. Рядом с обоими полями находится зеленый плюсик, который позволяет добавлять связанные записи соответствующего типа. Например, если щелкнуть на зеленом плюсике рядом с полем Publisher, то появится всплывающее окно для добавления издательства. После того как введенное во всплывающем окне издательство будет успешно добавлено, оно появится в форме Add Book. Удобно.

Как работает административный интерфейс

Как же на самом деле работает административный интерфейс? Довольно просто.

Когда во время запуска сервера фреймворк Django загружает конфигурацию URL из файла urls.py, он выполняет инструкцию admin.auto­ discover(), добавленную нами во время активации административного интерфейса. Эта функция обходит все элементы в списке приложений INSTALLED_APPS и в каждом из них отыскивает файл с именем admin.py. Если файл найден, то выполняется находящийся в нем код.

В файле admin.py для нашего приложения books каждый вызов метода admin.site.register() просто регистрирует одну из моделей в административном интерфейсе. А в списке моделей, доступных для редактирования, отображаются только явно зарегистрированные.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]