我有一个Django视图,它导出一个Excel文件,并在文件准备好时提示下载对话框。我安装了Celery和RabbitMQ,使这个任务成为后台任务。这意味着Excel文件将不会被提示下载,但我想将其保存在机器中的某个地方,以便用户稍后可以转到某个页面并下载它。
示例:
转到列表页面-〉点击导出-〉获取消息:“您的文件将很快准备好”-〉用户进入“下载”页面-〉在列表中查找文件-〉点击下载。
所以我现在要做的就是创建一个新模型:
class Export(models.Model):
dossier = models.ForeignKey(
Dossier,
related_name="Export",
on_delete=models.CASCADE,
default=None,
editable=False,
)
timestamp = models.DateTimeField(auto_now_add=True, editable=False)
file = models.FileField(
upload_to=get_rapport_filename, verbose_name="Fichiers Excel"
)
def __str__(self):
return "%s - %s" % (self.dossier, self.timestamp)
class Meta:
verbose_name = "Excel Report"
verbose_name_plural = "Excel Reports"
这是我用来生成Excel文件的代码:
@shared_task
def export_dossiers_factures(request):
dossier_queryset = Dossier.objects.filter(status_admin="Facturé")
today = str(date.today())
response = HttpResponse(
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
)
response["Content-Disposition"] = (
"attachment; filename=" + today + "-dossiers_factures.xlsx"
)
workbook = Workbook()
# Get active worksheet/tab
worksheet = workbook.active
worksheet.title = "Dossiers facturés"
# Define the titles for columns
columns = [
"Numéro",
"Créé le",
"Assurance",
"Prestataire",
"Matricule",
"N° de BL",
"N° de Facture",
"Date de mise à jour",
]
row_num = 1
# Assign the titles for each cell of the header
for col_num, column_title in enumerate(columns, 1):
cell = worksheet.cell(row=row_num, column=col_num)
cell.value = column_title
# Iterate through all movies
for dossier in dossier_queryset:
row_num += 1
# Define the data for each cell in the row
row = [
dossier.numero,
str(dossier.date_posted)[:10],
dossier.assurance.name,
dossier.created_by.user.username,
dossier.matricule,
dossier.bl,
dossier.invoice,
str(dossier.date_updated)[:10],
]
# Assign the data for each cell of the row
for col_num, cell_value in enumerate(row, 1):
cell = worksheet.cell(row=row_num, column=col_num)
cell.value = cell_value
workbook.save(response)
return response
我想把return response替换成一个东西,它把文件保存在某个地方,并创建一个指向该文件的对象。
1条答案
按热度按时间nxowjjhe1#
我做了和你差不多的事情,我是这么做的:
首先,我创建我的文件,并在其中写入我想要的内容,因此在您的情况下,如下所示:
一旦你创建了你的文件,你只需要用一个FileReponse来获取你的文件:
所以在这种情况下,你下载的文件已经存储在你把它放在,而不是只是创建一个文件,并返回它。
希望我明白你想要什么,这回答了你的问题:)