我尝试允许点击触发器执行一些后端动态csv创建,然后将其作为csv下载文件返回给用户。我想我不确定如何写出return语句而不仅仅是return response
。我发现其他一些帖子说我需要将我的网址设置为隐藏的iframe?不知道这意味着什么。有小费吗?
Ajax看起来像这样:
$('#download-maxes').on('click', function(){
$.ajax({
type: "POST",
url: "{{request.path}}download/",
dataType: 'json',
async: false,
data: JSON.stringify(workouts),
success: function(workoutData) {
console.log(workoutData);
},
error:function(error){
console.log(error);
}
});
});
我的django视图看起来像这样:
def download(request):
#(... a lot of mongo stuff here & other things defined)
workouts = json.load(request.body)
response = HttpResponse(content_type='text/xlsx')
response['Content-Disposition'] = 'attachment; filename="team_maxes.xlsx"'
writer = csv.writer(response)
writer.writerow(['Name', 'Date', 'Workout', 'Max'])
for member in team_members.all():
for wo in workouts:
wo_data = db.activity_types.find_one({"name": wo["name"]})
best_wo = db.activity.find_one({"u_id": member.user.id, "a_t": str(wo_data["_id"]), "is_last": 1}) or 0
member_name = member.user.first_name + ' ' + member.user.last_name
try:
max_stat = best_wo["y_ts"]
except:
max_stat = 0
try:
date = best_wo["e_d"]
except:
date = ""
workout_name = wo_data["name"]
writer.writerow([member_name, date, workout_name, max_stat])
return response
答案 0 :(得分:2)
您不需要使用ajax。由于您POST
将一些json数据添加到视图中,只需创建一个带有隐藏文本输入的表单,并将其值设置为json数据。然后在表单中制作一个常规提交按钮。
表单提交后,服务器以Content-Disposition: attachment; filename="team_maxes.xlsx"
响应,您的浏览器将自动触发下载。
如果你决定走这条路,请记住:
POST
方法,因此您必须记住在其中使用django的{% csrf_token %}
标记。您的workouts
json通过表单输入发送。因此,假设您将输入命名为“锻炼”,在您的视图中,您将执行以下操作:
workouts = json.loads(request.POST.get('workouts'))
当然还有一堆错误检查。