You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Django实现博客Admin面板统计报表功能的技术问询

在Django Admin中实现博客统计报表

方法一:使用django-reports-admin模块

1. 安装依赖

pip install django-reports-admin

2. 配置settings.py

将reports_admin添加到INSTALLED_APPS:

INSTALLED_APPS = [
    'django.contrib.admin',
    # 其他默认应用...
    'reports_admin',  # 新增该行
]

3. 定义统计报表类

在博客应用下新建reports.py(或直接写在admin.py中),编写统计逻辑:

from django.db.models import Count
from reports_admin.report import ReportAdmin
from .models import BlogModel, CommentModel

class BlogStatsReport(ReportAdmin):
    title = "博客统计报表"
    model = BlogModel
    fields = [
        'total_blogs',
        'blogs_with_comments',
        'draft_blogs',
        'published_blogs'
    ]

    def total_blogs(self, obj=None):
        return BlogModel.objects.count()
    total_blogs.short_description = "总博文数"

    def blogs_with_comments(self, obj=None):
        # 去重统计有评论的博文,避免同一博文多条评论重复计数
        return CommentModel.objects.values('blog').distinct().count()
    blogs_with_comments.short_description = "带评论的博文数"

    def draft_blogs(self, obj=None):
        return BlogModel.objects.filter(status=0).count()
    draft_blogs.short_description = "草稿博文数"

    def published_blogs(self, obj=None):
        return BlogModel.objects.filter(status=1).count()
    published_blogs.short_description = "已发布博文数"

4. 注册报表到Admin

修改admin.py,注册报表并修正原代码中的字段错误:

from django.contrib import admin
from blog.models import BlogModel, CommentModel
from .reports import BlogStatsReport  # 若报表写在admin.py中则无需该行

class PostAdmin(admin.ModelAdmin):
    list_display = ('blog_title', 'status','created_at','updated_at')
    list_filter = ('status',)
    # 修正原代码错误:将不存在的'content'字段改为models中的'blog'字段
    search_fields = ('blog_title', 'blog',)

admin.site.register(BlogModel, PostAdmin)
admin.site.register(CommentModel)
# 注册统计报表
admin.site.register_report(BlogStatsReport)

方法二:原生Django Admin实现首页统计(无需第三方模块)

如果不想依赖第三方库,可直接在Admin首页添加统计卡片:

1. 自定义Admin站点

修改admin.py:

from django.contrib import admin
from django.db.models import Count
from blog.models import BlogModel, CommentModel

class PostAdmin(admin.ModelAdmin):
    list_display = ('blog_title', 'status','created_at','updated_at')
    list_filter = ('status',)
    search_fields = ('blog_title', 'blog',)

# 自定义Admin首页逻辑
class CustomAdminSite(admin.AdminSite):
    def index(self, request, extra_context=None):
        extra_context = extra_context or {}
        # 计算统计数据
        extra_context['total_blogs'] = BlogModel.objects.count()
        extra_context['blogs_with_comments'] = CommentModel.objects.values('blog').distinct().count()
        extra_context['draft_blogs'] = BlogModel.objects.filter(status=0).count()
        extra_context['published_blogs'] = BlogModel.objects.filter(status=1).count()
        return super().index(request, extra_context)

# 替换默认Admin站点
admin_site = CustomAdminSite(name='custom_admin')
admin_site.register(BlogModel, PostAdmin)
admin_site.register(CommentModel)

# 若要保留默认/admin路径,取消下方注释
# admin.site = admin_site

2. 自定义Admin首页模板

复制Django默认的admin/index.html到项目模板目录,添加统计卡片:

<!-- 在合适位置插入统计模块 -->
<div class="module">
    <h2>博客统计</h2>
    <table>
        <tr><td>总博文数:</td><td>{{ total_blogs }}</td></tr>
        <tr><td>带评论的博文数:</td><td>{{ blogs_with_comments }}</td></tr>
        <tr><td>草稿博文数:</td><td>{{ draft_blogs }}</td></tr>
        <tr><td>已发布博文数:</td><td>{{ published_blogs }}</td></tr>
    </table>
</div>

注意事项

  • 使用django-reports-admin后,Admin菜单会新增「Reports」选项,点击即可查看统计报表
  • 原代码中search_fields的content字段不存在,已修正为blog字段

内容的提问来源于stack exchange,提问作者rahul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:25:23