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

Django项目中实现问卷结果的表格下载功能

Django项目中实现问卷结果的表格下载功能

嘿,我来帮你搞定在Django admin里给问卷加结果导出Excel的功能!你想的没错,给admin加个自定义action按钮完全是最优解,点一下就能下载,用户体验拉满。下面一步步来做:

1. 先安装Excel处理库

首先我们需要一个能生成Excel文件的库,推荐用openpyxl,Django对它的支持很好,直接用pip装就行:

pip install openpyxl

2. 编写导出Excel的Action函数

在你的admin.py文件里,先写一个处理导出逻辑的函数。这个函数会接收admin的请求、选中的问卷查询集(选了特定问卷就导出该问卷的结果,没选就导出所有),然后生成Excel文件并返回下载响应。

哦对了,这里默认你已经有了用户提交问卷的相关模型(比如记录用户提交的QuestionnaireResponse、记录每个问题回答的Answer),如果你的模型命名或者结构不一样,直接把代码里的模型名替换成你自己的就行:

from django.http import HttpResponse
from openpyxl import Workbook
from django.contrib import admin
# 记得导入你自己的模型,示例:
# from .models import Questionnaire, QuestionnaireResponse, Question, Answer

def download_questionnaire_results(modeladmin, request, queryset):
    # 创建一个新的Excel工作簿
    wb = Workbook()
    ws = wb.active
    ws.title = "问卷结果"

    # 先写表头,你可以根据自己的需求调整列名
    headers = [
        "问卷标题", "提交用户", "提交时间",
        "问题", "回答"
    ]
    ws.append(headers)

    # 遍历选中的问卷(没选的话就导出所有问卷的结果)
    for questionnaire in queryset:
        # 获取该问卷的所有用户提交记录
        responses = questionnaire.questionnaireresponse_set.all()
        for response in responses:
            # 遍历该提交下的所有问题回答
            for question in questionnaire.question_set.all():
                answer = response.answer_set.filter(question=question).first()
                # 组装这一行的数据
                row_data = [
                    questionnaire.title,
                    response.user.username if hasattr(response, 'user') else "匿名用户",
                    response.submitted_at.strftime("%Y-%m-%d %H:%M:%S"),
                    question.text,
                    answer.text if answer else "未回答"
                ]
                ws.append(row_data)

    # 设置响应头,让浏览器识别为下载文件
    response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = 'attachment; filename=questionnaire_results.xlsx'
    wb.save(response)
    return response

# 给这个action起个友好的名字,admin界面会显示这个名称
download_questionnaire_results.short_description = "下载选中问卷的结果为Excel表格"

3. 把Action注册到问卷Admin类里

接下来把这个导出函数加到你的QuestionnaireAdmin里,只需要加一个actions列表就行:

class QuestionnaireAdmin(nested_admin.NestedModelAdmin):
    model = Questionnaire
    inlines = [QuestionInline]
    list_display = ['title', 'description', 'color']
    search_fields = ['title', 'description']
    # 新增这一行,把导出action注册进来
    actions = [download_questionnaire_results]

一些实用的自定义小技巧

  • 如果你的每个问卷的问题都不一样,可以动态生成表头:比如先获取选中问卷的所有问题,把问题文本作为表头的一部分,这样导出的Excel会更贴合每个问卷的结构。
  • 可以给文件名加上时间戳,方便用户区分不同的导出文件:比如filename=f'questionnaire_results_{datetime.now().strftime("%Y%m%d_%H%M%S")}.xlsx'
  • 如果导出的数据量很大,可以改用流式响应,避免占用过多内存,不过中小数据量用上面的代码完全够用。

这样做完之后,你在Django admin的问卷列表页面,就能看到顶部的“动作”下拉框里多了一个下载选项,选中文卷(或者直接导出所有),点执行就能拿到Excel文件啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:59:35