Визуализация данных через шаблоны Admin
Django Admin создан для CRUD. Но в data-heavy организациях люди, которым нужно видеть данные, часто те же, кто управляет ими через админку. Вместо отдельного аналитического дашборда можно встроить визуализации прямо в рабочий процесс.
Подход 1: SVG-графики через Matplotlib
Генерируем графики на сервере и встраиваем как SVG:
import io
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
class SalesReportAdmin(admin.ModelAdmin):
change_list_template = 'admin/sales_report.html'
def changelist_view(self, request, extra_context=None):
fig, ax = plt.subplots(figsize=(10, 4))
data = self.get_monthly_sales()
ax.bar(data['months'], data['revenue'], color='#092E20')
ax.set_title('Выручка по месяцам')
buf = io.BytesIO()
fig.savefig(buf, format='svg', bbox_inches='tight')
chart_svg = buf.getvalue().decode('utf-8')
plt.close(fig)
extra_context = extra_context or {}
extra_context['chart_svg'] = chart_svg
return super().changelist_view(request, extra_context=extra_context)
Подход 2: Pandas DataFrame как HTML-таблица
def get_summary_table(self):
df = pd.DataFrame(
Order.objects.values('status')
.annotate(count=Count('id'), total=Sum('amount'))
)
return df.to_html(classes='table', index=False)
Рекомендации по производительности
- Кешируйте агрессивно — используйте
@method_decorator(cache_page(300)) - Ограничивайте диапазон — по умолчанию последние 30 дней
- Ленивая загрузка — для тяжёлых графиков используйте AJAX
- Управление памятью — всегда закрывайте фигуры:
plt.close()
Когда остановиться
Если вы строите более 3–4 кастомных view с графиками — пора подключать полноценный BI-инструмент (Metabase, Redash). Admin — для оперативного управления данными, а не для аналитики.
forum Обсуждение
Комментарии скоро будут доступны. Следите за обновлениями!