这是我的ajax功能:
function ajax_call(call_method,data_to_send) {
logger("function ajax_call. var data_to_send: ");
logger(data_to_send);
$('.clickable save_button').hide()
$.ajax({
type: 'POST',
url: call_method,
data: data_to_send,
success: function(data){
logger("data returned to page after ajax call: ");
logger(data);
$('.error_msg').html("Successfully saved record to database.");
$('.error_msg').fadeIn('slow');
setTimeout("$('.error_msg').fadeOut('slow');",5000); // 5 secs to give user enough time to read
$('.clickable save_button').show()
response_dispatcher(data); // This should contain object type at least
},
failure: function(){
$('.error_msg').html("There was an error while saving this information. Please try again. " +
"If the error persists, please contact us using the contact form.");
$('.error_msg').show;
$('.clickable save_button').show()
},
dataType: 'json'
});
}
并且,这是在后端发送到我的方法的数据: { 'display_order': “3”, '目标':“虚拟目标”, 'ID': - 1, 'OBJECT_TYPE': “目标” }
我已在我的应用程序中验证了收到的相同数据。
这是我的Django视图方法:
@login_required
def update_goal_view(request):
if request.method == 'POST' and request.is_ajax:
# Example data sent from AJAX Request
#qd = {u'display_order': [u'23'], u'object_type': [u'goal'], u'goal': [u'dummy goal'], u'id': [u'-1']}
qd = request.POST
goal = qd.get('goal','')
display_order = qd.get('display_order',99999)
id = int(qd.get('id',''))
object_type = qd.get('object_type','')
# For now, just return something to test populating data to the page
id = '100'
goal = 'goal returned'
object_type = object_type
data = {'id':id,'goal':goal,'object_type':object_type}
return HttpResponse(data,mimetype="application/json")
在Firebug中,我在ajax调用之后看到了这个:
POST http://127.0.0.1/xml/update_goal 200 OK 12ms
问题是,当看起来我的成功回调似乎从未被调用时...我这样说是因为从上面可以看到,我应该有一条消息写入我的记录器,但没有一个。我知道我的记录器工作正常,因为回调之外的所有其他消息都会写入我的记录器。
答案 0 :(得分:2)
我不认为Django会对字典进行自动序列化。您必须手动将它们序列化为JSON。
import simplejson
# ...
return HttpResponse(simplejson.dumps(data), mimetype="application/json")
答案 1 :(得分:0)
您不会显示触发ajax_call
功能的代码。如果它是提交按钮的onclick
事件或表单的onsubmit
事件的一部分,通常的原因是您忘记阻止表单正常提交 - 因此页面刷新并且Ajax调用丢失了。
在事件处理程序中使用event.preventDefault()
来解决此问题。