Написание вашего первого приложения Django, часть 7 ¶
Этот учебник начинается с того места, где остановился Урок 6 . Мы продолжаем работу над приложением веб-опроса и сосредоточимся на настройке автоматически сгенерированного сайта администратора Django, который мы впервые изучили в Уроке 2 .
Где получить помощь:
Если у вас возникли проблемы с прохождением этого руководства, перейдите в раздел « Получение справки » в FAQ.
Настройка формы администратора ¶
Зарегистрировав Question
модель с помощью admin.site.register(Question)
, Django смог построить представление формы по умолчанию. Часто вам нужно настроить внешний вид и работу формы администратора. Вы сделаете это, указав Django необходимые параметры при регистрации объекта.
Давайте посмотрим, как это работает, изменив порядок полей в форме редактирования. Замените admin.site.register(Question)
строку на:
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text']
admin.site.register(Question, QuestionAdmin)
Вы будете следовать этому шаблону - создайте класс администратора модели, а затем передайте его в качестве второго аргумента admin.site.register()
- каждый раз, когда вам нужно изменить параметры администратора для модели.
Это конкретное изменение выше делает «Дата публикации» перед полем «Вопрос»:

Это не впечатляет с двумя полями, но для форм администратора с десятками полей выбор интуитивно понятного порядка является важной деталью удобства использования.
И, говоря о формах с десятками полей, вы можете разделить форму на наборы полей:
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
Первый элемент каждого кортежа
fieldsets
- это заголовок набора полей. Вот как теперь выглядит наша форма:

Настройте список изменений администратора ¶
Теперь, когда страница администратора вопросов выглядит хорошо, давайте внесем некоторые изменения в страницу «списка изменений» - ту, которая отображает все вопросы в системе.
Вот как это выглядит на данный момент:

По умолчанию Django отображает str()
каждый объект. Но иногда было бы полезнее, если бы мы могли отображать отдельные поля. Для этого используйте параметр
list_display
администратора, который представляет собой кортеж имен полей, отображаемых в виде столбцов на странице списка изменений для объекта:
class QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date')
Для удобства давайте также включим was_published_recently()
метод из Урока 2 :
class QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date', 'was_published_recently')
Теперь страница со списком смены вопросов выглядит так:

Вы можете щелкнуть заголовки столбцов, чтобы отсортировать их по этим значениям, за исключением was_published_recently
заголовка, поскольку сортировка по выходным данным произвольного метода не поддерживается. Также обратите внимание, что заголовок столбца
was_published_recently
по умолчанию - это имя метода (с символами подчеркивания, замененными пробелами), и что каждая строка содержит строковое представление вывода.
Вы можете улучшить это, используя display()
декоратор для этого метода (in polls/models.py
) следующим образом:
from django.contrib import admin
class Question(models.Model):
# ...
@admin.display(
boolean=True,
ordering='pub_date',
description='Published recently?',
)
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
Дополнительные сведения о свойствах, настраиваемых с помощью декоратора, см list_display
. В разделе
.
Отредактируйте polls/admin.py
файл еще раз и добавьте улучшение на
Question
страницу списка изменений: фильтры с использованием
list_filter
. Добавьте следующую строку
QuestionAdmin
:
list_filter = ['pub_date']
Это добавляет боковую панель «Фильтр», которая позволяет пользователям фильтровать список изменений по
pub_date
полю:

Тип отображаемого фильтра зависит от типа поля, по которому вы фильтруете. Поскольку pub_date
это a DateTimeField
, Django знает, что нужно указать соответствующие параметры фильтра: «Любая дата», «Сегодня», «За последние 7 дней», «В этом месяце», «В этом году».
Это хорошо складывается. Добавим возможность поиска:
search_fields = ['question_text']
Это добавляет поле поиска вверху списка изменений. Когда кто-то вводит условия поиска, Django будет искать в этом question_text
поле. Вы можете использовать столько полей, сколько захотите, хотя, поскольку он использует LIKE
запрос за кулисами, ограничение количества полей поиска разумным числом упростит поиск в вашей базе данных.
А теперь самое время отметить, что списки изменений дают вам бесплатную разбивку на страницы. По умолчанию на странице отображается 100 элементов. , , , , И
все работают вместе , как вы думаете , что они должны.Change list pagination
search boxes
filters
date-hierarchies
column-header-ordering
Настройте внешний вид администратора ¶
Ясно, что «Администрирование Django» в верхней части каждой административной страницы просто смешно. Это просто текст-заполнитель.
Однако вы можете изменить его, используя систему шаблонов Django. Администратор Django работает на самом Django, а его интерфейсы используют собственную систему шаблонов Django.
Настройка шаблонов вашего проекта ¶
Создайте templates
каталог в каталоге вашего проекта (тот, который содержит manage.py
). Шаблоны могут находиться где угодно в вашей файловой системе, к которой имеет доступ Django. (Django запускается от имени любого пользователя, запущенного на вашем сервере.) Однако сохранение ваших шаблонов в проекте - хорошее соглашение, которому следует следовать.
Откройте свой файл настроек ( mysite/settings.py
запомните) и добавьте
DIRS
параметр в TEMPLATES
настройку:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
DIRS
список каталогов файловой системы для проверки при загрузке шаблонов Django; это путь поиска.
Организация шаблонов
Как и в случае со статическими файлами, у нас могут быть все наши шаблоны вместе в одном большом каталоге шаблонов, и это будет отлично работать. Однако шаблоны, принадлежащие определенному приложению, должны быть помещены в каталог шаблонов этого приложения (например polls/templates
), а не в каталог ( ) проекта templates
. Мы обсудим более подробно в руководстве по
многоразовым приложениям, почему мы это делаем.
Теперь создайте каталог с именем admin
inside templates
и скопируйте шаблон admin/base_site.html
из каталога шаблонов администратора Django по умолчанию в исходном коде самого Django ( django/contrib/admin/templates
) в этот каталог.
Где исходные файлы Django?
Если вам сложно найти в вашей системе расположение исходных файлов Django, выполните следующую команду:
$ python -c "import django; print(django.__path__)"
... \> py -c "import django; print (django .__ path__)"
Затем отредактируйте файл и замените
(включая фигурные скобки) именем своего сайта по своему усмотрению. У вас должен получиться такой фрагмент кода:{{ site_header|default:_('Django administration') }}
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}
Мы используем этот подход, чтобы научить вас переопределять шаблоны. В реальном проекте вы, вероятно, использовали бы django.contrib.admin.AdminSite.site_header
атрибут, чтобы упростить эту настройку.
Этот файл шаблона содержит много текста, например,
и . И теги являются частью языка шаблона Джанго. Когда Django выполняет рендеринг , этот язык шаблонов будет оценен для создания окончательной HTML-страницы, как мы видели в Уроке 3 .{% block branding %}
{{ title }}
{%
{{
admin/base_site.html
Обратите внимание, что любой из стандартных шаблонов администратора Django можно переопределить. Чтобы переопределить шаблон, сделайте то же самое, что и вы, base_site.html
- скопируйте его из каталога по умолчанию в свой собственный каталог и внесите изменения.
Настройка шаблонов вашего приложения ¶
Проницательные читатели спросят: но если DIRS
по умолчанию было пусто, как Django находил шаблоны администратора по умолчанию? Ответ заключается в том, что, поскольку APP_DIRS
установлено значение True
, Django автоматически ищет templates/
подкаталог в каждом пакете приложения для использования в качестве запасного варианта (не забывайте, что
django.contrib.admin
это приложение).
Наше приложение для опроса не очень сложное и не требует настраиваемых шаблонов администратора. Но если он станет более сложным и потребует модификации стандартных шаблонов администратора Django для некоторых его функций, было бы разумнее изменить шаблоны приложения , а не шаблоны проекта . Таким образом, вы можете включить приложение для опросов в любой новый проект и быть уверенным, что оно найдет нужные пользовательские шаблоны.
См. Документацию по загрузке шаблонов для получения дополнительной информации о том, как Django находит свои шаблоны.
Настройте страницу индекса администратора ¶
Аналогичным образом вы можете захотеть настроить внешний вид страницы индекса администратора Django.
По умолчанию он отображает все приложения INSTALLED_APPS
, которые были зарегистрированы в приложении администратора, в алфавитном порядке. Возможно, вы захотите внести существенные изменения в макет. В конце концов, индекс, вероятно, является самой важной страницей администратора, и им должно быть легко пользоваться.
Шаблон для настройки является admin/index.html
. (Сделайте то же, что и
admin/base_site.html
в предыдущем разделе - скопируйте его из каталога по умолчанию в каталог настраиваемого шаблона). Отредактируйте файл, и вы увидите, что он использует переменную шаблона с именем app_list
. Эта переменная содержит все установленные приложения Django. Вместо того, чтобы использовать это, вы можете жестко закодировать ссылки на объектно-ориентированные административные страницы любым удобным для вас способом.
Что дальше? ¶
На этом урок для начинающих заканчивается. А пока вы можете узнать, что делать дальше .
Если вы знакомы с упаковкой Python и хотите узнать, как превратить опросы в «многоразовое приложение», ознакомьтесь с Расширенным руководством: Как писать многоразовые приложения .