xlsxwriter 到 http 响应(下载文件)但在 django 中带有用户数据(表单)
xlsxwriter to http response (download file) but with user data (forms) in django
我卡住了,我想在页面上创建模板的用户输入数据 将创建一个模板。这是我到目前为止得到的,但它不会工作,我已经尝试过在线示例,但这些通常不会从用户那里获取数据来创建模板。
这是views.py
from django.http import HttpResponse
from django.shortcuts import render
import xlsxwriter
from xlsxwriter import workbook
from django.forms import Form, CharField, ChoiceField, IntegerField
from django.core.validators import MaxValueValidator, MinValueValidator
def home(request):
return render(request, 'my_app/home.html')
class TemplateForm(Form):
doc_name = CharField(label='Document name')
sheetnames = CharField(label='Sheetnames')
choices = []
for year in range (1900, 2050):
choices.append( (year, year) )
year1 = ChoiceField(label='Starting Year', initial=2021, choices=choices)
year2 = ChoiceField(label='Ending Year', initial=2022, choices=choices)
row_names = CharField(label='Column names')
def create_template(request):
if request.method == 'GET':
form = TemplateForm()
return render(request, 'my_app/create_template.html', {'form':form})
else:
form = TemplateForm(request.POST)
def create_form(doc_name, sheetnames, years, row_names):
workbook = xlsxwriter.Workbook(doc_name + '_template.xlsx')
worksheet_introduction = workbook.add_worksheet( "introduction" )
for i in sheetnames:
worksheet_data = workbook.add_worksheet(i)
worksheet_data.write_row(0, 1, years)
worksheet_data.write_column(1, 0, row_names)
workbook.close()
return workbook
这是my_app/templates/my_app/create_template.html
{% extends "my_app/base.html" %}
{% block content %}
<form action="create_template" method="GET">
{% csrf_token %}
<h1>Create your template</h1>
<div class="item">
<table>
{{ form.as_table }}
</table>
</div>
<div class="btn-block">
<input type="button" type="submit" value="Create and Download!"/>
</div>
</form>
{% endblock content %}
这是my_app/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='my-home'),
path('create-template/', views.create_template, name='my-create-template'),
]
我猜函数 create_template 重复了?
`def create_template(request):
return render(request, 'my_app/create_template.html')`
`def create_template(request):
if request.method == 'GET':
form = TemplateForm()
return render(request, 'my_app/create_template.html', {'form':form})
else:
form = TemplateForm(request.POST)`
第一个不包含 TemplateForm()。它总是这样调用:
路径('create-template/',views.create_template,名称='my-create-template')
.尝试删除第一个。
我卡住了,我想在页面上创建模板的用户输入数据 将创建一个模板。这是我到目前为止得到的,但它不会工作,我已经尝试过在线示例,但这些通常不会从用户那里获取数据来创建模板。
这是views.py
from django.http import HttpResponse
from django.shortcuts import render
import xlsxwriter
from xlsxwriter import workbook
from django.forms import Form, CharField, ChoiceField, IntegerField
from django.core.validators import MaxValueValidator, MinValueValidator
def home(request):
return render(request, 'my_app/home.html')
class TemplateForm(Form):
doc_name = CharField(label='Document name')
sheetnames = CharField(label='Sheetnames')
choices = []
for year in range (1900, 2050):
choices.append( (year, year) )
year1 = ChoiceField(label='Starting Year', initial=2021, choices=choices)
year2 = ChoiceField(label='Ending Year', initial=2022, choices=choices)
row_names = CharField(label='Column names')
def create_template(request):
if request.method == 'GET':
form = TemplateForm()
return render(request, 'my_app/create_template.html', {'form':form})
else:
form = TemplateForm(request.POST)
def create_form(doc_name, sheetnames, years, row_names):
workbook = xlsxwriter.Workbook(doc_name + '_template.xlsx')
worksheet_introduction = workbook.add_worksheet( "introduction" )
for i in sheetnames:
worksheet_data = workbook.add_worksheet(i)
worksheet_data.write_row(0, 1, years)
worksheet_data.write_column(1, 0, row_names)
workbook.close()
return workbook
这是my_app/templates/my_app/create_template.html
{% extends "my_app/base.html" %}
{% block content %}
<form action="create_template" method="GET">
{% csrf_token %}
<h1>Create your template</h1>
<div class="item">
<table>
{{ form.as_table }}
</table>
</div>
<div class="btn-block">
<input type="button" type="submit" value="Create and Download!"/>
</div>
</form>
{% endblock content %}
这是my_app/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='my-home'),
path('create-template/', views.create_template, name='my-create-template'),
]
我猜函数 create_template 重复了?
`def create_template(request):
return render(request, 'my_app/create_template.html')`
`def create_template(request):
if request.method == 'GET':
form = TemplateForm()
return render(request, 'my_app/create_template.html', {'form':form})
else:
form = TemplateForm(request.POST)`
第一个不包含 TemplateForm()。它总是这样调用: 路径('create-template/',views.create_template,名称='my-create-template') .尝试删除第一个。