2012-05-21 2 views
5

Используя Django, я хочу сделать некоторые данные доступными для загрузки.создание файла с django для загрузки с помощью javascript/jQuery

Мой JQuery вызов выглядит так до сих пор:

$.getJSON("/get_data", 
      { users: users, study: "{{study.id}}" } , 
      function(json){ 
       alert('some data!'); 
      } 
); 

Это вызывает один из моих взглядов Django, которые в свою очередь, порождает некоторые JSON и пытается сделать что JSON текст в файл для загрузки

jsonResponse = json.dumps(data, cls=DjangoJSONEncoder) 

jsonFile = cStringIO.StringIO() 
jsonFile.write(jsonResponse) 

response = HttpResponse(jsonFile, mimetype='application/json') 
response['Content-Disposition'] = 'attachment; filename=data.txt' 

return response 

Однако это не работает. Оглянувшись какое-то время, я считаю, что мне нужно что-то изменить с обоих концов - Javascript и код python/Django, но я не совсем понимаю, что именно.

Для Python моя основная забота заключается в использовании cStringIO (особенно тот факт, что я не могу выполнить закрытие jsonFile перед возвратом без запроса операции ValueError: I/O в закрытом файле).

Возможно, я также должен использовать FileWrapper (как в этом post), но я получаю одинаковые результаты с ним и без него.

Для Javascript, я не уверен, что должно войти в мою функцию обработчика успеха.

Любые указатели были бы очень признательны!

+0

Вы хотите, чтобы пользователю видеть диалог загрузки файла (за исключением, бегите отменить) или просто хотите отправить данные JSON для использования javascript? – xbtsw

+0

Первый - я хотел бы сделать диалоговое окно «Сохранить» браузера (что, по моему мнению, должно произойти с заголовком «Content-Disposition», правильно?) – arturomp

+0

@amp, что заставляет _download_ в отличие от рендеринг в браузере. Принуждение файла сохранения не является чем-то, что мы можем сделать ... например, у меня есть все мои загрузки, идущие прямо в мой каталог загрузки. Поисковые запросы Google показывают похожие заявления ... –

ответ

7

Классическим решением для этого является использование скрытого iframe.

В вашей urls.py

url(r'^test/getFile', 'getFile') 

В вашем views.py

def getFile(request): 
    fileContent = "Your name is %s" % request.GET['name'] 
    res = HttpResponse(fileContent) 
    res['Content-Disposition'] = 'attachment; filename=yourname.txt' 
    return res 

На странице

<script type="text/javascript"> 
    var data = {name: 'Jon'}; 
    $(function(){ 
     $("body").append('<iframe src="/test/getFile?'+ $.param(data) + '" style="display: none;" ></iframe>'); 
    }); 
</script> 
Смежные вопросы