我是Django的新手,但我是其他框架中的高级程序员。
我打算做什么:
按一个表单按钮,触发激活Ajax请求的Javascript,该请求由Django View处理(创建一个文件),返回简单的简单JSON数据(文件的名称) - 并作为链接附加到DOM-Element命名为'downloads'。
到目前为止我所取得的成就:
按下按钮,触发触发ajax请求的js,该请求由Django视图处理(创建一个文件),该请求返回作为副本附加的整个页面到名为'downloads'的DOM-Element(而不是简单的JSON数据) )。
这是从相应的Django视图中提取的代码:
context = {
'filename': filename
}
data['filename'] = render_to_string(current_app+'/json_download_link.html', context)
return HttpResponse(json.dumps(data), content_type="application/json")
我尝试了几种变体(如https://stackoverflow.com/a/2428119/850547),有和没有RequestContext对象;不同的渲染策略..我现在没有想法..
在我看来,没有可能在响应中不使用模板来发出ajax请求..: - /(但我希望我错了) 但即便如此:为什么Django会返回我没有传递给上下文的主模板(带有完整的DOM)... 我只想要JSON数据 - 而不是更多!
我希望我的问题是可以理解的...如果您需要更多信息,请告诉我,我会添加它们。
编辑:
即将发布的问题 - json_download_link.html如下所示:
<a href="{% url 'foobar:download' customer filename %}">Download</a>
但我甚至不想用它!
相应的jquery:
$.post(url, form_data)
.done(function(result){
$('#downloads').append('<a href="'+baseUrl+'/download/'+result['filename']+'" title="download"> Download CSV</a>')
})
答案 0 :(得分:0)
我不明白你的问题。当然,您可以在不使用模板的情况下发出Ajax请求。如果您不想使用模板,请不要使用模板。如果你只想返回JSON,那就去做吧。
如果没有任何问题的细节,我会想象你的Ajax请求没有达到你认为的那个视图,而是进入原始的整页视图。尝试在视图中添加一些日志记录,看看发生了什么。
答案 1 :(得分:0)
无需返回完整模板。您可以返回模板的部分并在前端渲染/追加它们。
模板可以根据需要小。例如,这是一个模板:
name.html
<p>My name is {{name}}</p>
您只能使用json.dumps()
返回此模板,并将其附加在前端。
你的json_download_link.html
是什么?
假设example.csv是字符串
data ={}
data['filename'] = u'example.csv'
return HttpResponse(simplejson.dumps(data), content_type="application/json")
这是你在找什么?