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

