Как включить навигацию боковой панели администратора django в пользовательском представлении?

У меня есть представление, наследующее от LoginRequiredMixin, TemplateView, которое отображает некоторые данные, используя в качестве основы шаблон admin/base_site.html. Я рассматриваю его как часть интерфейса администратора, поэтому он требует входа администратора. Я хотел бы сделать это представление частью интерфейса администратора Django, включив стандартную боковую панель навигации с левой стороны.

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

В настоящее время я просто собираю необходимые контекстные данные вручную, например:

data = super().get_context_data(**kwargs)
data.update(**{
    "is_popup": False,
    "site_header": None,
    "is_nav_sidebar_enabled": True,
    "has_permission": True,
    "title": "My title",
    "subtitle": None,
    "site_url": None,
    "available_apps": []
})

Боковая панель видна, но выводится сообщение об ошибке:

Error message: You don't have permission to view or edit anything

Добавление приложения в available_apps ("available_apps": ["my_app"]) тоже не помогает:

Rendered sidebar with no data

Итак, мой вопрос - как мне это сделать? Есть ли класс, от которого я могу наследоваться, чтобы добиться такого поведения? Или метод, который я могу вызвать, чтобы получить все необходимые контекстные данные для base_site.html? Или, возможно, я должен вставить некоторую информацию в мой шаблон? Возможно, мне нужен объект AdminSite или я могу как-то вызвать методы объекта по умолчанию?

Шаблон app_list.html, включенный в ваш базовый шаблон, требует контекстной переменной available_apps со структурой, описанной здесь.

Поскольку вы, вероятно, не сможете заставить этот include работать правильно в вашем приложении, вы также можете переопределить {% block nav-sidebar %} в вашем базовом шаблоне и предоставить HTML, который соответствует вашему случаю использования.

Но в конце концов, вероятно, не очень хорошая идея повторно использовать шаблоны, созданные для другого приложения (администратора), в вашем приложении, потому что трудно предсказать, как они будут себя вести, каковы их требования и, кроме того, сопровождение в долгосрочной перспективе также будет проблемой, поскольку они могут измениться с будущими версиями Django.

Вам необходимо включить контекстные переменные django admin по умолчанию, используемые в шаблоне. Это можно сделать, вызвав функцию each_context:


data.update(self.admin_site.each_context(request)

У меня также есть пользовательские представления и шаблоны администратора в моих проектах, и это хорошо работает для меня.

Случайно я заметил, что в DefaultAdminSite есть объект django.contrib.admin.sites, и он инстанцирован как site. Поэтому в моем случае достаточно просто использовать site.

from django.contrib.admin import AdminSite
from django.contrib.admin.sites import site
admin_site: AdminSite = site
data.update(**admin_site.each_context(self.request))

Более того, оказывается, я могу просто использовать apps в случае, если импорт site будет проблемой, как это делает DefaultAdminSite:

AdminSiteClass = import_string(apps.get_app_config("admin").default_site)
self._wrapped = AdminSiteClass()
Вернуться на верх