django - 在 django 动态视图中如何在运行时创建下载链接并将文件分配给下载链接
问题描述
view.py 处理 POST 请求的文件。
这个应用程序需要一张 excel 表和 xml 文件作为参数,xml 包含一些关于 excel 单元格位置的元数据。文件其在当前目录中创建一个 xml 文件。我想将此文件引用分配给模板中的锚标记下载链接。希望这能解释问题。
from django.shortcuts import render
import openpyxl
import xmltodict
import collections
def deep_convert_dict(layer):
to_ret = layer
if isinstance(layer, collections.OrderedDict):
to_ret = dict(layer)
try:
for key, value in to_ret.items():
to_ret[key] = deep_convert_dict(value)
except AttributeError:
pass
return to_ret
def index(request):
if "GET" == request.method:
return render(request, 'myapp/index.html', {})
else:
excel_file = request.FILES["excel_file"]
xml_file = request.FILES["xml_file"]
#print(xml_file)
print(excel_file)
# you may put validations here to check extension or file size
wb = openpyxl.load_workbook(excel_file,data_only=True)
# getting all sheets
sheets = wb.sheetnames
print(sheets)
# getting a particular sheet
sheet = wb["Paydoc"]
file1 = open('reelset.xml','a')
doc = {}
doc = xmltodict.parse(xml_file.read())
dict_1 =deep_convert_dict(doc)
print(dict_1)
for key, value in dict_1.items() :
for key1, value1 in value.items() :
x = '\n<'+key1+'>\n'
file1.write(x)
for key2, value2 in value1.items() :
print (key2)
reel1 ='\t<Reel ReelIndex="'+key2[-1]+'">'+'\n\t\t'+'<Elements>'+'\n'
coloumn = value2['Coloumn']
startrow = int (value2['StartIndex'][1:-1])
endrow = int (value2['StopIndex'][1:-1])
count1 = 0
while(startrow < endrow):
c = sheet[coloumn[1:-1]+str(startrow)]
strx = '\t\t\t'+'<Element id='
strx = strx + '"'+str(count1)+'">'+str(c.value).upper()+'</Element>'+ '\n'
reel1 = reel1 + strx
strx = ''
startrow = startrow + 1
count1 = count1 + 1
reel1 = reel1 + '\t\t</Elements>'+'\n'+ '\t</Reel>\n'
print(reel1)
file1.write(reel1)
reel1 = ''
y = '</'+key1+'>'
file1.write(y)
file1.close()
import os
cwd = os.getcwd()
print(cwd)
file2 = open('./reelset.xml','r')
data = file2.read()
file2.close()
return render(request, 'myapp/index.html', {"posts":data})
HTML template:
<html>
<head>
<title>
REELSET CREATION WEB TOOL
</title>
</head>
<body style="margin-top: 30px;margin-left: 30px;">
<form action="{% url "myapp:index" %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>PLEASE UPLOAD MATH EXCEL SHEET</p>
<input type="file"
title="Upload excel file"
name="excel_file"
style="border: 1px solid black; padding: 5px;"
required="required">
<p></p>
<p>PLEASE UPLOAD REELSET XML CONFIGURATION META DATA</p>
<input type="file"
title="Upload xml file"
name="xml_file"
style="border: 1px solid black; padding: 5px;"
required="required">
<p>
<input type="submit"
value="Upload"
style="border: 1px solid green; padding:5px; border-radius: 2px; cursor: pointer;">
</form>
<p></p>
<hr>
{% for row in excel_data %}
{% for cell in row %}
{{ cell }}
{% endfor %}
<br>
{% endfor %}
{{posts|escape }}
</body>
</html>
解决方案
推荐阅读
- elasticsearch - 我已经设置了启用 Xpack 安全性的 EFK 堆栈,它运行良好,直到其中一个 Elasticsearch pod 重新启动
- java - Android 中类似 facebook 的反应按钮
- kubernetes - 无法将 Pod 间关联性应用于 Airflow 调度程序
- django-rest-framework - 图像没有显示在 index.html 上,我正在 Django 中编辑酒店模板,只是基础知识
- c# - 使用 MediatR 控制器删除多个 ID
- python - 仅在完成写入后使用 .hdf5 文件
- r - make-distribution.sh 在 Make R 包步骤失败时失败。没有提供参数
- javascript - bsmultiselect:如何获取用户选择的项目列表或数组?
- azure - 如何通过 Azure CLI 将触发器绑定到 Azure Datafactory Pipeline?
- nlp - BERT 的输入是令牌 ID。如何将相应的输入令牌向量输入 BERT?