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

如何在Django中调用自定义Python类实现生成用户可下载的Excel模板

Django实现Excel模板生成下载修复步骤

1. 修正 my_app/forms.py 代码

补全表单字段定义,用于后续数据校验:

from django import forms

class CreateMyWebTemplateForm(forms.Form):
    doc_name = forms.CharField(max_length=50, strip=True)
    name_sheet = forms.CharField(max_length=20)
    year_start = forms.IntegerField(min_value=1800, max_value=2100)
    year_end = forms.IntegerField(min_value=1800, max_value=2100)
    name_rows = forms.CharField(max_length=200, strip=True)

2. 重写 my_app/views.py 逻辑

调整视图函数处理表单提交,直接在内存生成Excel返回给用户,无需写入服务器磁盘:

from django.shortcuts import render
from django.http import HttpResponse
from io import BytesIO
import xlsxwriter

def home(request):
    return render(request, 'my_app/home.html')

def create_template(request):
    if request.method == "POST":
        # 读取提交的表单数据
        doc_name = request.POST.get("doc_name", "default_template")
        name_sheet = request.POST.get("name_sheet", "Sheet1")
        year_start = int(request.POST.get("yearpicker", 2020))
        year_end = int(request.POST.get("yearpicker2", 2024))
        name_rows = [i.strip() for i in request.POST.get("name_rows", "").split(",") if i.strip()]
        
        # 生成年份列表
        years = list(range(year_start, year_end + 1))
        
        # 在内存中生成Excel文件
        output = BytesIO()
        workbook = xlsxwriter.Workbook(output)
        worksheet = workbook.add_worksheet(name_sheet)
        # 写入年份表头和行名称
        worksheet.write_row(0, 1, years)
        worksheet.write_column(1, 0, name_rows)
        workbook.close()
        
        # 构造下载响应
        output.seek(0)
        response = HttpResponse(
            output,
            content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        )
        response["Content-Disposition"] = f"attachment; filename={doc_name}_template.xlsx"
        return response
    # GET请求直接返回表单页面
    return render(request, "my_app/create_template.html")

原来的CreateMyWebTemplate类如果没有其他用途可以直接删除,逻辑已经整合到视图函数中。

3. 修改前端模板 my_app/template/my_app/create_template.html

调整表单提交属性,加上Django必填的CSRF校验字段,修正工作表名称取值:

  1. 替换表单标签为:
<form method="POST" action="{% url 'my-create-template' %}">
    {% csrf_token %}
  1. 修改国家选择框的option值为国家名称,避免生成的工作表名为数字:
<select name="name_sheet">
  <option value="">Country</option>
  <option value="Russia">Russia</option>
  <option value="Germany">Germany</option>
  <option value="France">France</option>
  <option value="Armenia">Armenia</option>
  <option value="USA">USA</option>
</select>
  1. 删除提交按钮上无效的href="#"属性:
<button type="submit">Create and Download!</button>

4. 功能测试

启动Django服务后访问/create-template/,填写表单信息提交即可直接下载生成的Excel文件。如果需要增加表单校验逻辑,可直接调用CreateMyWebTemplateForm的is_valid()方法对提交数据做合法性校验。


内容的提问来源于stack exchange,提问作者project.py

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:45:03