【问题标题】:How to get a HTTPRequest JSON response without using any kind of template?如何在不使用任何模板的情况下获得 HTTPRequest JSON 响应?
【发布时间】:2013-12-19 14:48:38
【问题描述】:

我是 Django 新手,但我是其他框架的高级程序员。

我打算做什么:

按下表单按钮,触发触发 Ajax 请求的 Javascript,该请求由 Django 视图(创建一个文件)处理,该视图返回简单的 JSON 数据(文件名) - 并作为链接附加到名为“下载”的 DOM 元素。

到目前为止我所取得的成就:

按下按钮,触发 js 触发一个 ajax 请求,该请求由 Django 视图处理(创建一个文件),该视图返回作为副本附加到名为“downloads”的 DOM 元素的整个页面(而不是简单的 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>')
    })

【问题讨论】:

  • 似乎您的 AJAX 请求调用了其他 sn-p 代码。可以从 Django 视图中提供 JSON,并且您的代码看起来不错。
  • render_to_string(current_app+'/json_download_link.html'...) 的输出是什么样子的?
  • 我添加了信息,请参阅上面的编辑

标签: ajax django json httprequest


【解决方案1】:

我不明白你的问题。当然,您可以在不使用模板的情况下发出 Ajax 请求。如果您不想使用模板,请不要使用模板。如果你只想返回 JSON,那么就这样做吧。

如果没有任何问题的详细信息,我会想象您的 Ajax 请求没有到达您认为的视图,而是转到原始的整页视图。尝试在视图中添加一些日志以查看发生了什么。

【讨论】:

  • 处理了正确的视图,我通过测试输出检查了它。当我做某事时。像: return HttpResponse(json.dumps({'foo':'bar'}), content_type="application/json") 结果是一样的:整个 DOM 将被复制并附加在只应附加文件名链接的地方..
  • 抱歉,这是不可能的。它不是来自你上面的观点,这就是我能说的。 Django 不会在没有被告知的情况下神奇地重新创建整个页面。
【解决方案2】:

无需返回完整模板。您可以返回部分模板并在前端渲染/附加它们。

模板可以任意小。例如这是一个模板:

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")

这是你要找的吗?

【讨论】:

  • 我添加了信息,请参阅上面的编辑
  • 好的。我不明白..你想要你的输出是什么?
  • 纯 JSON:{"filename":"example.csv"}
  • 关于您的编辑:是的,这是我已经尝试过的,也是我想要的……但在响应中,完整的 DOM 将被复制和附加……出了点问题……
  • 是的,我想,检查视图的响应,看看它返回了什么
猜你喜欢
  • 1970-01-01
  • 2021-12-24
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
相关资源
最近更新 更多