Django Admin的交互式图表和图形化报表

2023-04-11 00:00:00 报表 图表 图形化

Django Admin自带的交互式图表和图形化报表功能非常强大,可以让开发者方便地通过数据可视化来进行数据分析和决策。以下是使用Django Admin实现交互式图表和图形化报表的详细步骤。

首先,需要在Django Admin中安装以下依赖:

pip install django-chartjs
pip install pandas

然后,在需要生成图表或报表的模型类中定义一个方法,用于查询和统计数据。例如,我们可以创建一个名为“sales_report”的方法,用于统计指定日期范围内的销售额数据。

from datetime import timedelta
from django.utils import timezone
from django.db.models import Sum
from .models import Sales

class SalesAdmin(admin.ModelAdmin):
    def sales_report(self, obj):
        # 指定日期范围为过去7天
        start_date = timezone.now() - timedelta(days=7)
        end_date = timezone.now()

        # 查询指定日期范围内的销售额
        sales_data = Sales.objects.filter(sale_date__range=(start_date, end_date))
        total_sales = sales_data.aggregate(Sum('amount'))['amount__sum']

        # 返回统计数据作为字典对象
        return {'start_date': start_date, 'end_date': end_date, 'total_sales': total_sales}

    # 修改Admin界面的显示
    sales_report.short_description = 'Sales Report'
    sales_report.allow_tags = True

    # 将销售额数据添加到list_display中
    list_display = ['id', 'customer', 'product', 'amount', 'sales_report']

接下来,需要在Admin配置文件中定义一个新的方法,用于渲染图表或报表。例如,我们可以创建一个名为“sales_chart”的方法,用于显示销售额数据的饼图。

from django.shortcuts import render
from django.http import HttpResponse
from chartjs.views.lines import BaseLineChartView
from django_pandas.io import read_frame
from .models import Sales

class SalesChartView(BaseLineChartView):
    def get_labels(self):
        labels = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
        return labels

    def get_providers(self):
        providers = ["Sales"]
        return providers

    def get_data(self):
        start_date = timezone.now() - timedelta(days=7)
        sales_data = Sales.objects.filter(sale_date__range=(start_date, timezone.now()))
        df = read_frame(sales_data)
        data = []
        data.append(df['amount'].tolist())
        return data

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Sales Report'
        return context

最后,在Admin配置文件中定义一个URL,用于展示图表或报表。例如,我们可以创建一个URL为“sales_chart”的视图,并将其关联到sales_chart方法上。

from django.urls import path
from .views import SalesChartView

urlpatterns = [
    path('sales-chart/', SalesChartView.as_view(), name='sales_chart'),
]

现在,我们可以在Django Admin中访问“sales_chart”页面,并通过饼图来展示数据。

{% extends "admin/base_site.html" %}
{% load static %}

{% block extrahead %}
  {{ block.super }}
  {% load chartjs %}
{% endblock %}

{% block content %}
  {{ chartjs_css }}
  {{ chartjs_js }}
  <canvas id="line_chart" height="100"></canvas>
  <script>
    {% line_chart sales_chart scalable=True %}
  </script>
{% endblock %}

通过以上步骤,我们可以方便地在Django Admin中创建交互式图表和图形化报表,来进行数据分析和决策。例如,我们可以使用以下命令来带入我们之前的例子中的数据和字符串作为范例:

from datetime import date, timedelta
from django.utils import timezone
from decimal import Decimal
from .models import Sales

class SalesAdmin(admin.ModelAdmin):
    def sales_report(self, obj):
        start_date = timezone.now() - timedelta(days=7)
        end_date = timezone.now()
        sales_data = Sales.objects.filter(sale_date__range=(start_date, end_date))
        total_sales = sales_data.aggregate(Sum('amount'))['amount__sum']

        # 使用字符串作为范例
        example_string = 'pidancode.com'

        return {'start_date': start_date, 'end_date': end_date, 'total_sales': total_sales, 'example_string': example_string}

    sales_report.short_description = 'Sales Report'
    sales_report.allow_tags = True

    list_display = ['id', 'customer', 'product', 'amount', 'sales_report']

相关文章