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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:36:06