如何在Django类视图页面添加按钮,实现页面内容导出为Word文档下载
Django页面导出Word文档最优实现方案
我们选择python-docx作为核心依赖实现,优点是轻量无额外服务依赖、可精准控制生成的Word格式,和现有Django栈兼容性最好,实现步骤如下:
1. 安装依赖
首先安装需要的包:
pip install python-docx # 如果你的内容里包含HTML标签(就是模板中用了|safe过滤器的变量),额外安装docx-html转换工具 pip install docx-html
2. 新增导出路由
修改urls.py,添加导出接口的路由:
app_name = "patient" urlpatterns = [ path('add/', views.PatientAddView.as_view(), name="patient_add"), path( route='<patient_id>/', view=views.TreatmentTemplateView.as_view(), name='treatment_detail'), # 新增导出Word路由 path( route='<patient_id>/export-word/', view=views.TreatmentExportWordView.as_view(), name='treatment_export_word'), ]
3. 编写导出视图类
在views.py中新增导出视图,复用原有业务逻辑获取数据,生成Word后返回下载响应:
from django.http import HttpResponse from django.views.generic import View from docx import Document from docx_html import add_html from io import BytesIO class TreatmentExportWordView(View): def get(self, request, *args, **kwargs): patient_id = kwargs["patient_id"] # 复用原有逻辑获取上下文数据 result = find_treatment(patient_id) context = result[0] patient = result[1] # 初始化Word文档 doc = Document() # 写入内容,和页面展示顺序完全对应 doc.add_heading('Patient Summary', level=3) doc.add_paragraph(context["pt_letter"]) doc.add_heading('Current Medication', level=3) # 带HTML的内容用add_html方法转换 add_html(doc, context["current_med_letter"]) doc.add_heading('Past Medication', level=3) add_html(doc, context["past_med_letter"]) doc.add_heading('Plan', level=3) doc.add_heading('Treatment Recommendation', level=5) add_html(doc, context["newmed_letter"]) add_html(doc, context["existingmed_letter"]) doc.add_heading('Physical Health Monitoring', level=5) add_html(doc, context["monitor_letter"]) doc.add_heading('Potential Drug Interactions', level=5) add_html(doc, context["interaction_letter"]) # 生成文件流返回 buffer = BytesIO() doc.save(buffer) buffer.seek(0) # 设置响应头,触发下载 response = HttpResponse( buffer.read(), content_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document" ) response["Content-Disposition"] = f"attachment; filename=treatment_{patient.name}_{patient_id}.docx" return response
4. 页面添加导出按钮
在原HTML模板的合适位置(比如页面顶部)添加导出按钮:
{% block content %} <!-- 新增导出按钮,放在内容最前面 --> <div style="margin-bottom: 20px;"> <a href="{% url 'patient:treatment_export_word' patient_id=patient_id %}" class="btn btn-primary">导出为Word文档</a> </div> <!-- 原有页面内容保持不变 --> <h3>Patient Summary</h3> ... {% endblock content %}
可选优化方案
如果你需要导出的Word和前端页面样式完全一致,也可以选择pandoc作为转换工具,先渲染完整的HTML页面再转换为Word,缺点是需要服务器安装pandoc依赖,性能略低于直接用python-docx生成。
内容的提问来源于stack exchange,提问作者RobMcC
相关产品推荐
相关产品推荐

