Django:按下按钮时提供动态生成的数据作为附件

msh*_*ren 3 javascript python django templates httpresponse

问题概述:

我正在创建一个基于 Django 的客户端,旨在从 Web 服务返回数据。该项目的目标是根据用户在表单中选择的值从 Web 服务将数据返回给用户。表单提交后,会生成一个查询字符串,发送到 Web 服务,并以字符串形式返回页面数据。目前,该数据在浏览器中显示给用户。我想提供允许用户单击按钮并下载数据的功能。

问题:

当用户单击浏览器中的下载按钮时,如何将数据返回给用户?如何使相同数据的不同选项可用(即 application/json 或 text/csv)?

当前(未工作)实施:

我正在尝试执行以下操作,但失败了:

视图.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...})
Run Code Online (Sandbox Code Playgroud)

实用程序.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 
Run Code Online (Sandbox Code Playgroud)

模板.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>
Run Code Online (Sandbox Code Playgroud)

我将测试部分放在那里是为了测试警报是否有效。确实如此。但是,当我单击 json 数据的按钮时,没有任何反应。

我的做法完全错误吗?或者我缺少什么小东西吗?

msh*_*ren 5

解决方案:

在进一步研究这个问题并与同事讨论后,我的问题似乎在于尝试将响应对象传递给 JavaScript。对于那些感兴趣的人,我通过仔细地重新路由数据来解决了这个问题。

视图.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
Run Code Online (Sandbox Code Playgroud)

模板.html

然后,当用户按下按钮时,锚点将通过 url 链接到辅助 django 视图,该视图将向用户呈现下载选项。

<li class = 'button'>
    <a  href = "{% url client.views.returnJSON %}"> 
        JSON
    </a>
</li>
Run Code Online (Sandbox Code Playgroud)

urls.py

最后,我只是将我的 url 模式指向视图。

urlpatterns = patterns('',
    (r'^somesite/$', views.view),
    (r'^somesite/json$',  views.returnJSON),
)
Run Code Online (Sandbox Code Playgroud)

到目前为止,这个方法对我来说非常有效!如果有人有任何其他建议或更好的方法,我当然愿意听取。