Преглед на проблема:
Създавам базиран на Django клиент с намерението да върна данни от уеб услуга. Целта на този проект е да върне данни на потребителя от уеб услугата въз основа на стойностите, избрани от потребителя във формуляр. При подаване на формуляра се генерира низ на заявка, изпраща се до уеб услугата и данните за страницата се връщат като низ. В момента тези данни се показват на потребителя в браузъра. Искам да осигуря функционалност, която ще позволи на потребителя да щракне върху бутон и да изтегли данните.
Въпрос:
Как мога да върна данните на потребителя, когато щракне върху бутон в своя браузър за изтегляне? Как да направя налични различни опции за едни и същи данни (т.е. приложение/json или текст/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 на anchor класа и след това използвах 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 данните, нищо не се случва.
Напълно погрешно ли подхождам към това? Или има нещо малко, което ми липсва?