在django生态里,有没有读取数据库,类似execel格式显示的插件
你想在Django生态中找到能读取数据库数据、并以类似Excel表格形式展示的插件,方便直观地查看和操作数据库中的股票数据(比如日线数据、AI分析报告)。
答案是:有很多成熟的方案,其中既有轻量的Django内置/第三方插件,也有功能强大的专业表格组件,下面按「易用性从高到低、功能从简到繁」的顺序,给你推荐最实用的3种方案,全部贴合Django生态,且能直接对接你已有的ORM模型。
方案1:Django Admin 内置表格(最简单,无需额外安装插件)
这是最快捷的方式,无需安装任何第三方包,利用你已经配置过的Django Admin后台,它本身就提供了类似Excel的表格展示、排序、筛选、分页功能,还支持数据导出为Excel/CSV格式(需简单配置)。
核心优势
- 零额外依赖,快速上手,符合你已有的Django经验
- 支持排序、筛选、分页、批量操作,满足基础表格需求
- 可配置导出Excel/CSV,直接落地使用
配置步骤(基于你已有的Stock模型)
开启Admin数据导出功能(Django 3.2+ 内置,无需额外插件)
修改stock_analysis/admin.py,给模型Admin类添加actions和导出相关配置,以StockDailyDataAdmin为例:from django.contrib import admin from django.http import HttpResponse import csv from datetime import datetime from .models import StockBasic, StockDailyData, StockAIAnalysis # 自定义导出CSV动作(模拟Excel格式,更易被Excel打开) def export_as_csv(modeladmin, request, queryset): """将选中的数据导出为CSV文件(可直接用Excel打开)""" response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = f'attachment; filename="{modeladmin.model._meta.verbose_name_plural}_{datetime.now().strftime("%Y%m%d%H%M%S")}.csv"' writer = csv.writer(response) # 写入表头(对应模型字段) fields = [field for field in modeladmin.model._meta.fields if field.name not in ['create_time', 'id']] writer.writerow([field.verbose_name for field in fields]) # 写入数据行 for obj in queryset: row = [] for field in fields: value = getattr(obj, field.name) # 格式化日期字段,避免Excel识别异常 if isinstance(value, datetime): row.append(value.strftime('%Y-%m-%d %H:%M:%S')) else: row.append(str(value) if value else '') writer.writerow(row) return response export_as_csv.short_description = "导出选中数据为CSV(Excel可打开)" # 注册股票基础信息 @admin.register(StockBasic) class StockBasicAdmin(admin.ModelAdmin): list_display = ("ts_code", "name", "industry", "list_date") search_fields = ("ts_code", "name") list_filter = ("industry",) actions = [export_as_csv] # 添加导出动作 # 注册股票日线数据 @admin.register(StockDailyData) class StockDailyDataAdmin(admin.ModelAdmin): list_display = ("stock", "trade_date", "open", "close", "pct_chg", "volume") search_fields = ("stock__name", "stock__ts_code") list_filter = ("trade_date",) date_hierarchy = "trade_date" actions = [export_as_csv] # 添加导出动作 # 可选:开启排序,点击表头即可排序(默认支持) ordering = ["-trade_date", "stock__name"] # 注册AI分析报告 @admin.register(StockAIAnalysis) class StockAIAnalysisAdmin(admin.ModelAdmin): list_display = ("stock", "analysis_type", "analysis_time", "confidence", "suggestion") search_fields = ("stock__name", "stock__ts_code", "analysis_content") list_filter = ("analysis_type", "analysis_time") date_hierarchy = "analysis_time" actions = [export_as_csv] # 添加导出动作使用效果
启动Django服务,登录Admin后台(http://127.0.0.1:8000/admin/),进入对应的模型列表:- 表格形式展示所有数据,表头可点击排序
- 右侧有筛选栏,可按日期、行业等筛选
- 顶部有「动作」下拉框,可选择导出选中数据为CSV(直接用Excel打开即可)
适用场景
- 快速查看、筛选、导出数据库数据,无需复杂前端
- 后台管理使用,不需要面向普通用户展示
方案2:django-tables2(轻量第三方插件,专门用于Django表格展示)
django-tables2 是Django生态中最流行的表格插件之一,专门解决「前端表格展示」问题,支持与Django ORM无缝对接,自动生成表格,还支持排序、分页、筛选、导出Excel等功能,比Admin表格更灵活,可嵌入到你自己的前端模板中(面向普通用户展示)。
核心优势
- 与Django ORM高度兼容,直接传入QuerySet即可生成表格
- 可自定义表格样式、字段展示,灵活嵌入到现有模板
- 支持分页、排序、导出,功能比Admin表格更丰富
- 轻量,学习成本低,贴合Django开发习惯
实现步骤
安装依赖
pip install django-tables2 pip install tablib # 用于导出Excel/CSV格式配置Django(settings.py)
注册应用:INSTALLED_APPS = [ # 其他已有应用 'django_tables2', # 注册django-tables2 'stock_analysis', ] # 可选:配置django-tables2的默认模板 DJANGO_TABLES2_TEMPLATE = "django_tables2/bootstrap4.html"创建表格类(stock_analysis/tables.py)
新建tables.py文件,定义与模型对应的表格类,指定要展示的字段:import django_tables2 as tables from .models import StockBasic, StockDailyData, StockAIAnalysis # 股票基础信息表格 class StockBasicTable(tables.Table): # 自定义字段:添加查看分析的链接(关联到你的现有视图) detail_link = tables.LinkColumn( 'stock_analysis_detail', args=[tables.A('ts_code')], verbose_name='操作', text='查看AI分析' ) class Meta: model = StockBasic template_name = "django_tables2/bootstrap4.html" # 采用bootstrap样式(美观) fields = ("ts_code", "name", "industry", "list_date", "detail_link") # 要展示的字段 orderable = True # 允许排序 attrs = {"class": "table table-striped table-hover"} # 表格样式(bootstrap) # 股票日线数据表格 class StockDailyDataTable(tables.Table): class Meta: model = StockDailyData template_name = "django_tables2/bootstrap4.html" fields = ("stock__name", "trade_date", "open", "high", "low", "close", "pct_chg", "volume") orderable = True attrs = {"class": "table table-striped table-hover"}修改视图(stock_analysis/views.py)
在现有视图中引入表格类,传入QuerySet,传递给模板:from django.shortcuts import render, get_object_or_404 from django_tables2 import RequestConfig from .models import StockBasic, StockAIAnalysis from .services.ai_analyzer import DeepSeekStockAnalyzer from .tables import StockBasicTable # 引入表格类 def stock_list(request): """股票列表页面,用django-tables2展示表格""" stocks = StockBasic.objects.all() # 初始化表格,传入QuerySet stock_table = StockBasicTable(stocks) # 配置分页、排序(自动识别请求中的排序、分页参数) RequestConfig(request, paginate={"per_page": 20}).configure(stock_table) return render(request, 'stock_analysis/stock_list.html', { 'stock_table': stock_table # 传递表格对象给模板 })修改模板(stock_analysis/templates/stock_analysis/stock_list.html)
嵌入表格到前端模板,替换原有手动写的HTML表格:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>股票列表 - AI选股系统</title> <!-- 引入bootstrap样式,让表格更美观 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"> </head> <body> <div class="container mt-5"> <h1>股票列表</h1> <!-- 直接渲染django-tables2表格 --> {% load django_tables2 %} {% render_table stock_table %} </div> </body> </html>(可选)添加Excel导出功能
借助tablib库,在视图中添加导出接口,示例:from django.http import HttpResponse import tablib from .models import StockBasic def export_stock_basic_excel(request): """导出股票基础信息为Excel文件""" stocks = StockBasic.objects.all() # 构建数据集 headers = ["股票代码", "股票名称", "所属行业", "上市日期"] data = [] for stock in stocks: data.append([ stock.ts_code, stock.name, stock.industry or "未知", stock.list_date.strftime("%Y-%m-%d") if stock.list_date else "" ]) # 生成Excel文件 dataset = tablib.Dataset(*data, headers=headers) response = HttpResponse(dataset.xlsx, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response['Content-Disposition'] = 'attachment; filename="股票基础信息.xlsx"' return response配置URL(
stock_analysis/urls.py):path('export/stock-basic/', views.export_stock_basic_excel, name='export_stock_basic'),
适用场景
- 你需要在自定义前端页面中展示表格(面向普通用户)
- 需要灵活自定义表格样式、字段、操作按钮
- 想要更美观的表格展示效果
方案3:Django + Handsontable(前端专业表格,类似Excel交互体验)
如果你的需求是「高度模拟Excel的交互体验」(比如单元格编辑、公式计算、拖拽排序、筛选等),可以使用 Handsontable(一款前端表格库),与Django后端配合,实现「后端读取数据库数据 → 传递给前端 → Handsontable以Excel形式展示/编辑 → 提交数据回写数据库」的完整流程。
核心优势
- 交互体验与Excel几乎一致,支持单元格编辑、拖拽、筛选、排序
- 功能强大,支持大数据量展示、公式计算、数据验证
- 与Django后端无缝对接,支持前后端分离传输数据(JSON)
简化实现步骤(核心流程)
前端引入Handsontable
在模板中引入Handsontable的CSS和JS文件:<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/handsontable/dist/handsontable.full.min.css"> <script src="https://cdn.jsdelivr.net/npm/handsontable/dist/handsontable.full.min.js"></script>Django视图传递JSON格式数据
from django.http import JsonResponse from .models import StockBasic import json def stock_list_json(request): """返回股票数据的JSON格式,供前端Handsontable读取""" stocks = StockBasic.objects.all() # 构建JSON数据 stock_data = [] headers = ["ts_code", "name", "industry", "list_date"] for stock in stocks: stock_data.append([ stock.ts_code, stock.name, stock.industry or "未知", stock.list_date.strftime("%Y-%m-%d") if stock.list_date else "" ]) return JsonResponse({ 'headers': headers, 'data': stock_data })前端模板用Handsontable渲染表格
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>股票列表 - Excel风格</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/handsontable/dist/handsontable.full.min.css"> <style> #stockTable { margin: 20px; } </style> </head> <body> <h1>股票列表(Excel风格)</h1> <div id="stockTable"></div> <script src="https://cdn.jsdelivr.net/npm/handsontable/dist/handsontable.full.min.js"></script> <script> // 从Django后端获取JSON数据 fetch("{% url 'stock_list_json' %}") .then(response => response.json()) .then(data => { // 初始化Handsontable表格 const container = document.getElementById('stockTable'); const hot = new Handsontable(container, { data: data.data, colHeaders: data.headers, rowHeaders: true, sortable: true, filter: true, editable: false, // 设为true可允许单元格编辑 height: 600, width: "100%", licenseKey: 'non-commercial-and-evaluation' // 非商业用途免费 }); }); </script> </body> </html>
适用场景
- 你需要高度模拟Excel的交互体验,供用户在线编辑、分析数据
- 需要更强大的表格功能(公式、数据验证、拖拽等)
- 允许用户在线修改数据并回写数据库
总结
- 快速后台管理:优先使用 Django Admin内置表格,零额外依赖,支持导出CSV/Excel,满足后台数据查看需求;
- 自定义前端展示:优先使用 django-tables2,轻量灵活,与Django ORM无缝对接,可嵌入自定义模板,适合面向普通用户展示;
- 高度Excel交互:使用 Django + Handsontable,功能强大,交互体验好,适合需要在线编辑、分析数据的场景。
这三种方案都完全贴合Django生态,可根据你的实际需求选择,其中 django-tables2 是兼顾「易用性」和「灵活性」的最优选择,非常适合你当前的股票系统场景。
(豆包)