Как настроить диалог загрузки файлов, используя Django и jQuery? - PullRequest
2 голосов
/ 01 августа 2011

Я новичок в 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>

Джанго:

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()

1 Ответ

1 голос
/ 01 августа 2011

Вместо выполнения POST в AJAX браузер должен перейти к представлению естественным образом. Браузер запросит загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...