Django: предоставлять динамически сгенерированные данные в виде вложений при нажатии кнопки - PullRequest
2 голосов
/ 12 октября 2011

Обзор проблемы:

Я создаю клиент на основе Django с намерением вернуть данные из веб-службы.Цель этого проекта - вернуть данные пользователю из веб-службы на основе значений, выбранных пользователем в форме.После отправки формы строка запроса генерируется, отправляется веб-службе, а данные страницы возвращаются в виде строки.В настоящее время эти данные отображаются пользователю в браузере.Я хочу предоставить функциональность, которая позволяла бы пользователю нажимать кнопку и загружать данные.

Вопрос:

Как я могу вернуть данные пользователю, когда они нажимают кнопку в своембраузер для скачивания?Как сделать разные параметры одних и тех же данных доступными (например, application / json или text / csv)?

Текущая (неработающая) реализация:

Я пытаюсь и терплю неудачу,сделать следующее:

views.py

Возвращение объекта render_to_response моего шаблона.В шаблон я передаю форму и данные в ее различных формах.

def view(request):
    #Do stuff, get data as string

    #Get data into needed formats (see utils.py)
    jsonData  = jsonToJsonFile(dataString, fileName)

    return render_to_response('template.html', {'someForm'    : aForm,
                                                'regularData' : stringData,
                                                'jsonData'    : jsonData...})

utils.py

Содержит функции для получения данных в виде строки и возврата объектов ответа.В этой части я не уверен, правильно ли я поступаю.Я вызываю эти функции в представлении, чтобы получить jsonData (и csvData) в соответствующие им форматы из исходной строки данных.

def jsonToJsonFile(dataString, fileName):

    #Get the data as json
    theData = json.dumps(dataString)

    #Prepare to return a json file
    response = HttpResponse(theData, mimetype = 'application/json')
    response['Content-Disposition'] = 'attachment; filename=' + str(fileName) + '.json'

    #return the response
    return response 

template.html

В настоящее время я передаю ответы вшаблон.Это где я действительно потерян, и еще не начал находить хорошее решение.Я ожидаю, что мне нужно будет использовать javascript, чтобы возвращать переменные (jsonData и csvData) пользователю при нажатии кнопки.Я попытался использовать действие onclick класса привязки, а затем с помощью javascript вернуть переменную django ответа - но это действительно не работает.

<li class = 'button'>
    <a  href = "#dataButtons" onclick = "javaScript:alert('test');"> 
    TEST
    </a>
</li>
<li class = 'button'>
    <a  href = "#dataButtons"  onclick = "javaScript: var a = '{{ jsonData }}'; return a;"> 
    JSON
    </a>
</li>

Я поместил тестовую часть втам, ну, чтобы проверить, будет ли предупреждение работать.Оно делает.Однако, когда я нажимаю кнопку для данных json, ничего не происходит.

Я неправильно подхожу к этому?Или мне чего-то не хватает?

Ответы [ 2 ]

4 голосов
/ 13 октября 2011

Решение:

Посмотрев на проблему чуть дальше и поговорив об этом с коллегой, мне кажется, что моя проблема заключается в попытке передать объект ответа в javascript. Для тех, кто заинтересован, я решил проблему с небольшой тщательной перенаправлением данных.

views.py

В моем views.py я добавил пару строк кода в моём главном представлении, которые бы устанавливали переменные двух дополнительных представлений (одно для csv, одно для json) к объектам ответа, содержащим данные. Эти два дополнительных представления будут вызываться при нажатии соответствующих кнопок, возвращая httpresponse и предлагая пользователю загрузить.

#MAIN VIEW FUNCTION
def view(request):
    #Do stuff, get data as string

    #Get data into needed formats 
    jsonData  = jsonToJsonFile(dataString, fileName)

    #Set values to external view ****NEW PART****
    returnJSON.jsonData = jsonData

    #Render main template
    return render_to_response('mainTemplate.html', {'someForm'    : aForm,
                                                    'regularData' : dataString})

#SECONDARY VIEW TO RETURN JSON DATA TO USER ****NEW PART****
def returnJSON(request):
    #Simply return the response
    return returnJSON.jsonData

template.html

Затем, когда пользователь нажимает кнопку, якорь связывается через URL с дополнительным представлением django, которое предоставит пользователю возможность загрузки.

<li class = 'button'>
    <a  href = "{% url client.views.returnJSON %}"> 
        JSON
    </a>
</li>

urls.py

Наконец, я просто указал свои шаблоны URL на вид.

urlpatterns = patterns('',
    (r'^somesite/$', views.view),
    (r'^somesite/json$',  views.returnJSON),
)

Пока этот метод отлично работает для меня! Если у кого-то есть какие-либо другие предложения или более эффективный метод, я, безусловно, буду рад его услышать.

1 голос
/ 12 октября 2011

Я думаю, вам нужно изменить свой javascript, чтобы он начал загрузку файла - см. Этот вопрос и ответ: загрузка файла с использованием JavaScript

...