Django & Ajax:如何创建从通过 AJAX 发布数据到 Django 的 csv 文件下载?



我正在尝试允许点击触发器执行一些后端动态 csv 创建,然后将其作为 csv 下载文件返回给用户。我想我不确定除了放return response之外,我应该如何写出 return 语句.我遇到了其他一些帖子,说我需要将我的 url 设置为隐藏的 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
你不需要

使用 ajax。由于您正在将一些 json 数据POST到您的视图中,因此只需创建一个包含隐藏文本输入的表单,并将其值设置为 json 数据。然后在表单中制作一个常规提交按钮。

当表单提交时,服务器响应Content-Disposition: attachment; filename="team_maxes.xlsx",您的浏览器将自动触发下载。

如果您决定走这条路,请记住:

  • 你现在使用的是带有POST方法的常规 html 表单,所以你必须记住在其中使用 django 的 {% csrf_token %} 标签。
  • 在提交表单之前,您可能已将输入的值设置为 json 字符串。
  • 您的workouts json 以表单输入的形式发送。因此,假设您将输入命名为"锻炼",在您看来,您将执行以下操作:

    workouts = json.loads(request.POST.get('workouts'))
    

    当然,还有一堆错误检查。

相关内容

  • 没有找到相关文章

最新更新