Написание вашего первого приложения Django, часть 7

Этот учебник начинается с того места, где остановился Урок 6 . Мы продолжаем работу над приложением веб-опроса и сосредоточимся на настройке автоматически сгенерированного сайта администратора Django, который мы впервые изучили в Уроке 2 .

Где получить помощь:

Если у вас возникли проблемы с прохождением этого руководства, перейдите в раздел « Получение справки » в FAQ.

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

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

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

опросы / admin.py
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()- каждый раз, когда вам нужно изменить параметры администратора для модели.

Это конкретное изменение выше делает «Дата публикации» перед полем «Вопрос»:

Поля были переупорядочены

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

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

опросы / admin.py
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администратора, который представляет собой кортеж имен полей, отображаемых в виде столбцов на странице списка изменений для объекта:

опросы / admin.py
class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question_text', 'pub_date')

Для удобства давайте также включим was_published_recently()метод из Урока 2 :

опросы / admin.py
class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question_text', 'pub_date', 'was_published_recently')

Теперь страница со списком смены вопросов выглядит так:

Страница со списком изменений опросов, обновлена

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

Вы можете улучшить это, используя display() декоратор для этого метода (in polls/models.py) следующим образом:

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 paginationsearch boxesfiltersdate-hierarchiescolumn-header-ordering

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

Ясно, что «Администрирование Django» в верхней части каждой административной страницы просто смешно. Это просто текст-заполнитель.

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

Настройка шаблонов вашего проекта

Создайте templatesкаталог в каталоге вашего проекта (тот, который содержит manage.py). Шаблоны могут находиться где угодно в вашей файловой системе, к которой имеет доступ Django. (Django запускается от имени любого пользователя, запущенного на вашем сервере.) Однако сохранение ваших шаблонов в проекте - хорошее соглашение, которому следует следовать.

Откройте свой файл настроек ( mysite/settings.pyзапомните) и добавьте DIRSпараметр в TEMPLATESнастройку:

mysite / settings.py
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. Мы обсудим более подробно в руководстве по многоразовым приложениям, почему мы это делаем.

Теперь создайте каталог с именем admininside 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 и хотите узнать, как превратить опросы в «многоразовое приложение», ознакомьтесь с Расширенным руководством: Как писать многоразовые приложения .

Copyright ©2021 All rights reserved