你想在Django生态中找到能读取数据库数据、并以类似Excel表格形式展示的插件,方便直观地查看和操作数据库中的股票数据(比如日线数据、AI分析报告)。

答案是:有很多成熟的方案,其中既有轻量的Django内置/第三方插件,也有功能强大的专业表格组件,下面按「易用性从高到低、功能从简到繁」的顺序,给你推荐最实用的3种方案,全部贴合Django生态,且能直接对接你已有的ORM模型。


方案1:Django Admin 内置表格(最简单,无需额外安装插件)

这是最快捷的方式,无需安装任何第三方包,利用你已经配置过的Django Admin后台,它本身就提供了类似Excel的表格展示、排序、筛选、分页功能,还支持数据导出为Excel/CSV格式(需简单配置)。

核心优势

  • 零额外依赖,快速上手,符合你已有的Django经验
  • 支持排序、筛选、分页、批量操作,满足基础表格需求
  • 可配置导出Excel/CSV,直接落地使用

配置步骤(基于你已有的Stock模型)

  1. 开启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]  # 添加导出动作
  2. 使用效果
    启动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开发习惯

实现步骤

  1. 安装依赖

    pip install django-tables2
    pip install tablib  # 用于导出Excel/CSV格式
  2. 配置Django(settings.py)
    注册应用:

    INSTALLED_APPS = [
        # 其他已有应用
        'django_tables2',  # 注册django-tables2
        'stock_analysis',
    ]
    
    # 可选:配置django-tables2的默认模板
    DJANGO_TABLES2_TEMPLATE = "django_tables2/bootstrap4.html"
  3. 创建表格类(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"}
  4. 修改视图(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  # 传递表格对象给模板
        })
  5. 修改模板(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>
  6. (可选)添加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)

简化实现步骤(核心流程)

  1. 前端引入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>
  2. 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
        })
  3. 前端模板用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的交互体验,供用户在线编辑、分析数据
  • 需要更强大的表格功能(公式、数据验证、拖拽等)
  • 允许用户在线修改数据并回写数据库

总结

  1. 快速后台管理:优先使用 Django Admin内置表格,零额外依赖,支持导出CSV/Excel,满足后台数据查看需求;
  2. 自定义前端展示:优先使用 django-tables2,轻量灵活,与Django ORM无缝对接,可嵌入自定义模板,适合面向普通用户展示;
  3. 高度Excel交互:使用 Django + Handsontable,功能强大,交互体验好,适合需要在线编辑、分析数据的场景。

这三种方案都完全贴合Django生态,可根据你的实际需求选择,其中 django-tables2 是兼顾「易用性」和「灵活性」的最优选择,非常适合你当前的股票系统场景。
(豆包)

标签: none