Django:在按钮按下时提供动态生成的数据作为附件
Posted
技术标签:
【中文标题】Django:在按钮按下时提供动态生成的数据作为附件【英文标题】:Django : provide dynamically generated data as attachment on button press 【发布时间】:2011-12-05 16:30:57 【问题描述】:问题概述:
我正在创建一个基于 Django 的客户端,目的是从 Web 服务返回数据。该项目的目标是根据用户在表单中选择的值从 Web 服务向用户返回数据。提交表单后,会生成一个查询字符串,将其发送到 Web 服务,并将页面数据作为字符串返回。目前,该数据在浏览器中显示给用户。我想提供允许用户单击按钮并下载数据的功能。
问题:
当用户单击浏览器中的按钮进行下载时,如何将数据返回给用户?如何使相同数据的不同选项可用(即 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
模板.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 数据的按钮时,什么也没有发生。
我的做法完全错误吗?还是我遗漏了什么小东西?
【问题讨论】:
您也可以发布javascript,因为如果没有任何反应,它应该是客户端。如果返回的值是错误的显示在页面中而不是下载,那将是服务器端的。 javascript 在我的模板部分。真的只是一行:onclick = "javaScript: var a = ' jsonData '; return a;"其中 jsonData 是响应的 django 变量。据我所知,从 Web 服务收到的值是正确的。当我直接从视图中渲染变量 jsonData(即返回 jsonData)时,它会按原样打开文件进行下载并且数据很好 - 让我相信这可能是我在模板中调用它的方式。 【参考方案1】:解决方案:
在进一步查看问题并与同事讨论后,似乎我的问题在于尝试将响应对象传递给 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
模板.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),
)
到目前为止,这种方法对我来说效果很好!如果有人有任何其他建议或更好的方法,我当然愿意听取。
【讨论】:
【参考方案2】:我认为您需要更改您的 javascript 以使其开始文件下载 - 请参阅此问题和答案: starting file download with JavaScript
【讨论】:
嗯,谢谢,但我不完全有一个文件可以链接到某个地方。我想我可以将数据保存到一个文件中,但我希望远离它作为一种选择,因为它增加了一个更高级别的复杂性。我希望有一种方法可以在不调用视图的情况下检索数据。 啊,明白你的意思。称为“数据 URI”的东西可能会有所帮助:***.com/questions/3665115/… 这实际上看起来非常有用,我会在以后的项目中记住它!然而,在查看了几个选项之后,我认为我现在找到了一个非常好的解决方案......以上是关于Django:在按钮按下时提供动态生成的数据作为附件的主要内容,如果未能解决你的问题,请参考以下文章
按下时将动态创建的按钮信息传递给函数。 kivymd, kivy, 蟒蛇
使用 TouchableHighlight 在 React Native 中按下时如何更改按钮颜色?