我正在创建一个基于Django的客户端,目的是从Web服务返回数据。此项目的目标是根据用户在表单中选择的值,从Web服务向用户返回数据。在表单提交时,生成查询字符串,发送到Web服务,页面数据作为字符串返回。目前,该数据在浏览器中显示给用户。我想提供允许用户单击按钮并下载数据的功能。
如果用户点击浏览器中的按钮进行下载,我怎么能将数据返回给用户?如何使用相同数据的不同选项(即application / json或text / csv)?
我正在尝试并且未能做到以下几点:
返回模板的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...})
包含将数据作为字符串并返回响应对象的函数。这部分我不确定我是否做得正确。我在视图中调用这些函数,以便从原始数据字符串中将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
我目前正在将回复传递给模板。这是我真正迷失的地方,还没有开始找到一个好的解决方案。我希望在单击按钮时我需要使用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数据的按钮时,没有任何反应。
我接近这个完全错了吗?或者是否有一些我想念的小事?
答案 0 :(得分:4)
在进一步查看问题并与同事讨论之后,似乎我的问题在于尝试将响应对象传递给javascript。对于那些感兴趣的人,我通过稍微仔细的数据重新路由解决了这个问题。
在我的views.py中,我在主视图中添加了几行代码,它们将两个额外视图的变量(一个用于json的csv一个)设置为包含数据的响应对象。然后在按下各自的按钮时调用这两个额外的视图,返回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
然后,当用户按下该按钮时,锚点通过URL链接到辅助django视图,该视图将向用户显示下载选项。
<li class = 'button'>
<a href = "{% url client.views.returnJSON %}">
JSON
</a>
</li>
最后,我只是将我的网址模式指向了视图。
urlpatterns = patterns('',
(r'^somesite/$', views.view),
(r'^somesite/json$', views.returnJSON),
)
到目前为止,这种方法对我来说非常有用!如果有人有任何其他建议或更好的方法,我当然愿意听取它。
答案 1 :(得分:1)
我认为你需要更改你的javascript才能启动文件下载 - 请参阅此问题&amp;回答: starting file download with JavaScript