如何在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校验字段,修正工作表名称取值:
- 替换表单标签为:
<form method="POST" action="{% url 'my-create-template' %}"> {% csrf_token %}
- 修改国家选择框的
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>
- 删除提交按钮上无效的
href="#"属性:
<button type="submit">Create and Download!</button>
4. 功能测试
启动Django服务后访问/create-template/,填写表单信息提交即可直接下载生成的Excel文件。如果需要增加表单校验逻辑,可直接调用CreateMyWebTemplateForm的is_valid()方法对提交数据做合法性校验。
内容的提问来源于stack exchange,提问作者project.py
相关产品推荐
相关产品推荐

