Skip to main content
 首页 » 编程设计

python之如何使用 Django 和 jQuery 设置文件下载对话框

2025年05月04日31qq号

我是 jQuery 新手,我一直在尝试设置一个文件下载对话框窗口,但没有成功。如果对话窗口加载时,用户应该可以选择下载动态生成的文件。我无法设置对话窗口。

在调试时,我可以看到生成了一个有效的 http 响应。生成的内容处置数据如下:

 attachment; filename=foo.csv 

用例:

我的应用程序是一个 Django 网络应用程序,用于在 Django 模板上显示从数据库中获取的数据。如果用户单击带有文本“导出到 Csv”的按钮,我想在需要时提供以 csv 格式下载显示数据的能力

代码

Javascript/HTML

/** 
 * Creates a file to be downloaded upon clicking a button. 
 */ 
 $('button[id*="ExportToCsv"]').click(function() { 
    var report_type = $(this).attr('id').split('ExportToCsv')[0]; 
    // var report_date = '{{ report_date }}'.split('-'); 
    $.ajax({ 
        url: '/reports/' + report_type + '/export_to_csv/', 
        type: 'POST', 
        mimeType: 'text/csv', 
        data: {'report_date': '{{ report_date }}'}, 
        success: function(data) { 
            return data; 
        } 
    }); 
 }); 

HTML:

<button id = "ExportToCsv">Export To Csv</button> 

Django:

class CsvOutputResponse(object): 
  """Handles a csv file attachment object. 
 
  Attributes: 
    filename: String name of the csv file. 
    response: HttpResponse object. 
    writer: Csv writer object. 
  """ 
 
def __init__(self, filename): 
  """Initalizes the CsvOutputResponse class. 
 
   Args: 
     filename: String name of the csv file. 
   """ 
   self.filename = filename 
   self.response = self._InitializeResponse() 
   self.writer = csv.writer(self.response) 
 
def _InitializeResponse(self): 
  """Initialize a csv HttpResponse object. 
 
  Returns: 
    HttpResponse object. 
  """ 
  response = django_dep.HttpResponse(mimetype='text/csv') 
  response['Content-Disposition'] = ( 
      'attachment; filename=%s.csv' % self.filename) 
  return response 
 
def WriteRow(self, content): 
  """Write a single row to the csv file. 
 
  Args: 
    content: List of strings of csv field values. 
  """ 
  self.writer.writerow(content) 
 
def WriteRows(self, content): 
  """Write multiple row to the csv file. 
 
  Args: 
    content: List of lists of strings of csv field values. 
  """ 
  self.writer.writerows(content) 
 
def GetCsvResponse(self): 
  """Get the csv HttpResponse object. 
 
  Returns: 
    content: HttpResponse object. 
  """ 
  return self.response 

urls.py

(r'^reports/(?P<report_type>\w+)/export_to_csv/$', 
 'myproject.myapp.views.ExportTab') 

views.py

def ExportTab(request, report_type): 
  """Generates a file to be exported and made available for download. 
 
  Args: 
    request: HttpRequest object. 
    report_type: String type of report to be generated. 
 
  Returns: 
    HttpResponse object. 
  """ 
  report_date = request.POST['report_date'] 
  db = database.Database() 
  if report_type == 'Trailing': 
    reports = containers.GetTrailingReports() 
  elif report_type == 'Ytd': 
    reports = containers.GetYtdReports() 
  return CsvOutputResponse('foo.txt').writeRows(reports).GetCsvResponse() 

请您参考如下方法:

不是在 AJAX 中执行 POST,而是让浏览器自然地导航到 View 。然后浏览器会提示下载。