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

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

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

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

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

Когда вы регистрировали модель Question с ним admin.site.register(Question) , Django по умолчанию мог представлять объект в форме. Однако часто бывает желательно настроить отображение и поведение формы. Это делается путем предоставления Django определенных параметров при регистрации объекта.

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

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

Эта модификация приводит к тому, что «Дата публикации» появляется перед полем «Вопрос»:

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

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

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

polls/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 - это заголовок группы полей. Вот как теперь выглядит наша форма:

Форма теперь имеет наборы полей

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

Теперь, когда страница администрирования Questions выглядит немного лучше, давайте улучшим страницу «список для модификации» - ту, которая отображает все вопросы в системе.

Вот как это выглядит на данный момент:

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

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

polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question_text', 'pub_date')

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

polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question_text', 'pub_date', 'was_published_recently')

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

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

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

Вы можете улучшить это, присвоив этому методу (в polls/models.py ) некоторые атрибуты, например:

polls/models.py
class Question(models.Model):
    # ...
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

Дополнительные сведения об этих свойствах метода см list_display . В разделе .

Отредактируйте файл еще раз polls/admin.py и улучшите страницу списка для редактирования Questions : добавив фильтрацию с помощью атрибута list_filter . Добавьте следующую строку в QuestionAdmin :

list_filter = ['pub_date']

Это добавляет боковую панель «Фильтр», которая позволяет фильтровать список для изменения в соответствии с полем pub_date :

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

Тип отображаемого фильтра зависит от типа поля для фильтрации. Как pub_date и поле DateTimeField , Django знает, как предоставить соответствующие параметры фильтра: «Все даты», «Сегодня», «Последние 7 дней», «В этом месяце», «В этом году».

Выглядит лучше. Добавим функционал поиска:

search_fields = ['question_text']

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

Сейчас самое время отметить, что списки редактирования дают вам большую свободу компоновки. По умолчанию на странице отображается 100 элементов. В pagination редактировать списки, то , то , то и все работают вместе для оптимального использования.boîtes de recherche filtres hiérarchies calendaires tri selon l'en-tête de colonne

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

Ясно, что «Администрирование 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 каталоге project ( ). Мы обсудим причины этого выбора более подробно в руководстве по многоразовым приложениям .

Теперь создайте в templates названном каталоге admin и скопируйте туда шаблон admin/base_site.html из каталога шаблонов администратора по умолчанию в исходном коде 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. Когда 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 находит свои шаблоны.

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

Точно так же может быть желательно настроить внешний вид страницы индекса интерфейса администратора Django.

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

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

А потом ?

На этом вводное руководство заканчивается. А пока вы всегда можете проверить несколько ресурсов на странице следующих шагов .

Если вам удобно создавать пакеты Python и вы заинтересованы в том, чтобы узнать, как сделать приложение опроса «многоразовым приложением», ознакомьтесь с .

Copyright ©2020 All rights reserved