Python 在django admin中上载后提示文件下载
我有一个django管理页面,用户正在上传一个文件,数据在内存中读取,而不实际存储文件 根据内容,在磁盘上生成一个新文件。在调用Python 在django admin中上载后提示文件下载,python,django,file,download,django-admin,Python,Django,File,Download,Django Admin,我有一个django管理页面,用户正在上传一个文件,数据在内存中读取,而不实际存储文件 根据内容,在磁盘上生成一个新文件。在调用save\u model之前,所有这些都在clean方法中发生。下面是生成输出文件的方法 def clean(self): obj = Parser() cleaned_data = super(MyMethodAdminForm, self).clean() input_data = self.request.FILES['file_name'
save\u model
之前,所有这些都在clean
方法中发生。下面是生成输出文件的方法
def clean(self):
obj = Parser()
cleaned_data = super(MyMethodAdminForm, self).clean()
input_data = self.request.FILES['file_name'].read().split('\n')
base_file = settings.MEDIA_ROOT + "/uploads/" + cleaned_data.get('file_name').name
# This is the output file, which needs to be downloaded
output_filename = base_file.replace('.csv', '_output.csv')
output_list = []
# Read the file and prepare the output data
# on the basis of the input data
for line in input_data:
data = line.split(",")
if len(data) > 1:
dt = obj.get_data()
current_list = [data[0], data[1]]
else:
dt = obj.get_data()
current_list = [data[0]]
current_list.append(str(dt))
output_list.append(current_list)
# Prepare the file on the basis of the output data
with open(output_filename, 'a') as outcsv:
# configure writer to write standard csv file
writer = csv.writer(outcsv, delimiter=',', quotechar=' ', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
for item in output_list:
if len(item) > 2:
# Write item to outcsv
writer.writerow([item[0], item[1], item[2]])
else:
writer.writerow([item[0], item[1]])
return cleaned_data
现在,我的问题是,我必须允许此文件下载,但由于上载域是通过负载平衡器处理的,因此我无法真正提供链接(老实说,这也不是首选方式)。是否有任何方法可以强制提示文件下载
我从下面的两个问题中得到了一些提示,但我不明白我需要把这些更改标题的东西放在哪里
response\u change
但即使是pdb也没有被呼叫…所以还没有帮助!!:(
全班:
class MyMethodAdminForm(forms.ModelForm):
class Meta(object):
model = MyMethod
fields = ["file_name"]
def clean(self):
obj = Parser()
cleaned_data = super(MyMethodAdminForm, self).clean()
input_data = self.request.FILES['file_name'].read().split('\n')
base_file = settings.MEDIA_ROOT + "/uploads/" + cleaned_data.get('file_name').name
output_filename = base_file.replace('.csv', '_output.csv')
output_list = []
# Read the file and prepare the output data
# on the basis of the input data
for line in input_data:
data = line.split(",")
if len(data) > 1:
dt = obj.get_data()
current_list = [data[0], data[1]]
else:
dt = obj.get_data()
current_list = [data[0]]
current_list.append(str(dt))
output_list.append(current_list)
# Prepare the file on the basis of the output data
with open(output_filename, 'a') as outcsv:
# configure writer to write standard csv file
writer = csv.writer(outcsv, delimiter=',', quotechar=' ', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
for item in output_list:
if len(item) > 2:
# Write item to outcsv
writer.writerow([item[0], item[1], item[2]])
else:
writer.writerow([item[0], item[1]])
return cleaned_data
无论您准备在何处向用户发送响应:
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="%s"' % filename
writer = csv.writer(response)
# now write to writer however you want to output your CSV
根据调用视图的位置,您可能需要覆盖多种方法。原因是django支持不同类型的管理操作,包括
更改
、添加
、删除
。我不确定您使用的是哪种方法,因此您可能必须同时尝试这两种方法。首先,我将尝试覆盖response\u change
和response\u add
方法:
class MyMethodAdmin(admin.ModelAdmin):
form = MyMethodAdminForm
def return_csv(self):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="%s"' % filename
writer = csv.writer(response)
writer.writerow(['Django','Admin'])
return response
def response_change(self, request, obj):
return self.return_csv()
def response_add(self, request, obj):
return self.return_csv()
“…无论您准备在何处向用户发送响应…”这就是我不知道的一点…哪种方法是关键?请看我的更新,在你有
clean
的完整类上。它只包含我添加的clean
方法,但我需要整个类,包括类名和继承来帮助。你的缩进响应是否改变了意图nal?错误复制粘贴的缺点…已更正
class MyMethodAdmin(admin.ModelAdmin):
form = MyMethodAdminForm
def return_csv(self):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="%s"' % filename
writer = csv.writer(response)
writer.writerow(['Django','Admin'])
return response
def response_change(self, request, obj):
return self.return_csv()
def response_add(self, request, obj):
return self.return_csv()