2013-07-29 40 views
0

我有一个允许用户更改数据库中的帐户信息的表单。提交时,表单调用Django视图,并提交给隐藏的iframe。该视图返回一个JSON对象。无法让jquery查看从Django视图返回的JSON对象

隐藏的iframe可以看到这个对象。在Chrome浏览器中,我可以看到我期望写入iframe的字段。

jQuery尝试访问这些数据时遇到了麻烦。 jQuery函数从不运行。控制台日志和警报从不触发。我需要能够从django视图返回的数据触发该函数。

这是我的模板文件中的jQuery块。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js'>  
$('#hiframe').ready(function(){ 
    $.getJSON('{{url_root}}/userupdate/update/', function(data) { 
     var parseddata = $.parseJSON(data); 
     console.log(parseddata); 
     alert(parseddata.UserId); 
    });        
}); 
</script> 

这里是iframe和模板的形式:

<iframe name='hiddeniframe' id='hiframe' scrolling='no' frameborder='0' style='display:none'></iframe> 

<form id="userUpdate" name="userUpdate" action="{{url_root}}/userupdate/update/" method="POST" target='hiddeniframe'> 

最后,这是我从我的观点函数返回的字典:

json_data = {'UserId': user_name, 
      'FirstName': user_fname, 
      'LastName': user_lname, 
      'Status': user_status} 

return HttpResponse(json.dumps(json_data), content_type='application/json') 

编辑发布解决方案:

knbk给了我一些很好的建议,我可以使用它们来完成这项工作。我删除了HTML表单,并使用下面的代码从视图中发送和接收。

添加我的解决方案,以防其他人遇到同样的问题。

  $.ajax({ 
       url: "{{url_root}}/userupdate/update/", 
       type: 'POST', 
       dataType: 'json', 
       data: data, 
       success: function(dta){ 
        jsonfromDB = dta[0]; 

        if (jsonfromDB['ErrMsg'].length > 0) { 
         alert(jsonfromDB['ErrMsg'].join("\n")); 
        } 

        // This is true when we have updated the database. 
        if(jsonfromDB['UpdateStatus']) { 

         // Grab the User input 
         fname.val(jsonfromDB['FirstName']); 
         lname.val(jsonfromDB['LastName']); 
         stat.val(jsonfromDB['Status']); 

         // We want the user to know when success has happened. 
         alert('Your database update was sucessful.'); 
        } 
       }, 
       error: function(errdata){ 
        jfDB = errdata[0]; 
        if (jfDB['ErrMsg'].length > 0) { 
         alert(jfDB['ErrMsg'].join("\n")); 
        } 
       } 
      }); 

回答

0

您的代码存在一些问题。

首先,您的一个script标记中包含一个具有src属性的JavaScript代码。如果您在html文件中包含javascript代码,请使用单独的script标记,而不要使用src属性。这就是为什么你的代码没有被执行,为什么你没有看到控制台中的任何东西。

如果您解决了这个问题,并且您的表单中的代码与我认为的相同(使用没有指定onclick或任何内容的提交按钮),则首先使用正确的数据向服务器发送POST请求,然后,当请求完成并且JSON作为原始文本加载到您的iframe中时,您将发送另一个JSON请求到相同的url,这次是通过GET请求,而不包含任何数据,并且不知何故期望获得与您相同的响应进入你的iframe。

此外,使用`{%url'view_name'%}标记通常比将硬编码到您的模板中更好。

你应该怎么做,是有一个buttonsubmit输入与附加的onClick函数。如果您使用的是submit按钮,则需要prevent the default action,并且连接到您的action url的视图应处理默认表单提交。您的JSON方法应该使用不同的url/django视图来返回JSON数据。

这个onclick函数应该从窗体收集数据,并使用AJAX请求将其发布到服务器。在您更新服务器上的数据时,HTML标准建议使用POST请求。为此,您需要使用$.ajax()而不是$.getJSON()

JavaScript代码应该看起来有点像这样:

<script type="text/javascript"> 
$('#<submitbutton_id').onclick(function(event) { 
    data = { 
    UserId: $('#userid_field_id').val(), 
    etc. 
    } 
    $.ajax("{% url 'update_user_ajax' %}", 
    { type: 'POST', 
    dataType: 'json', 
    data: data, 
    success: function(data) { 
     <parse the data> 
    } 
    event.preventDefault() 
}) 
</script> 
+0

谢谢你的回复。 我不是新手编程,但我是网络编程新手。一位同事也指出了同样的

0

我不确定隐藏的iframe是什么点。你也没有说明实际问题是什么。

但是,看起来您的jQuery代码不在<script>...</script>标签内,这可能是问题所在。

+0

对不起。让我编辑它。 隐藏的iframe是因为我有几种形式(每个用户一个),我想用更改的内容更新页面。我提交给隐藏的iframe,然后使用jQuery来更新已更改的行。 我试图将问题归结为最基本的问题。 – yubus

+0

我还添加了更多的解释,我需要帮助搞清楚。 – yubus

相关问题