基于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
相关产品推荐
相关产品推荐

