YUI.io (ajax) 和 Django - 更新只能工作一次,YUI 无法再次找到表单

Posted

技术标签:

【中文标题】YUI.io (ajax) 和 Django - 更新只能工作一次,YUI 无法再次找到表单【英文标题】:YUI.io (ajax) and Django - update works only once, YUI can't find form again 【发布时间】:2010-12-11 22:43:06 【问题描述】:

我正在使用 YUI 3.0 io 通过 ajax 提交表单数据。表单字段是从 django 视图 (ModelForm) 创建的。第一次加载表单时,我更新一个字段并使用 YUI onclick 提交表单,它调用运行 django 视图的 io 回调并再次返回带有更新数据的 ModelForm。这工作一次(保存到数据库,在表单上显示更新数据)。之后,就像更新表单字段无法识别一样,当我再次发布时,它不会获取任何新更改。

//Ajax call to Load Member Info
YUI().use("node-base", "io-form","node", function(Y) 
    var formObj = Y.one('#MemberForm')
    var uri = "http://localhost:8000/MemberInfo/ member_id ";
    var cfg = 
        method:'POST',
        form: 
            id: formObj
        
    
     function complete(id, o) 
      var id = id; // Transaction ID.
      var data = o.responseText; // Response data.
      document.getElementById('InputDiv').innerhtml = data;//the data is the memberinfo html template w/ data
    ;

    function start(transactionid, arguments)
    
        document.getElementById('InputDiv').innerHTML = "processing...";
    

    Y.on('io:complete', complete, this);
    Y.on('io:start', start, this);

    var request = Y.io(uri);//run callback on load. don't POST, just load'

    function LoadMemberAjax()
    
         Y.io(uri, cfg);//callback, POST.
    
    Y.on("click", LoadMemberAjax, "#btnMemberInfo");
    
);


#Load Member Info - ajax call
def MemberInfo(request, member_id):
existingMember = get_object_or_404(Member, pk=member_id)
if request.method == "POST":
    if 'userlogin' in request.POST: #we will get username and pwd from login and find person
        NewMember = MemberForm(instance=existingMember)
    else:
        f = MemberForm(request.POST, instance = existingMember)
        if f.is_valid():
            f.save()
            NewMember = MemberForm(instance=existingMember)

else:
    NewMember = MemberForm(instance=existingMember)

return render_to_response("MemberInfo.html", "Member": NewMember,)

HTML:

<body>   
  <form id="MemberForm">
      <div id="InputDiv">Loading Your Member Information...One Moment...
      </div>
      <input type="button" id="btnMemberInfo" value="save">
  </form>

来自 Django 的模板返回为“数据”

 % for field in Member %
  field.label_tag 
  field 
 % endfor %

【问题讨论】:

【参考方案1】:

我不太了解 YUI,但我想这里发生的事情是,当 AJAX 重新加载表单时,它还创建了一个全新的按钮 - 它不再将 onclick 事件绑定到 LoadMemberAjax。您可能需要在 complete 函数的末尾重新运行 Y.on("click", LoadMemberAjax, "#btnMemberInfo"); 来重新绑定它。

或者,您可以使用等效于 jQuery 的 live 调用来确保即使在重新创建元素时绑定仍然存在。

【讨论】:

不,这没有帮助。该按钮在 ajax 调用之外。形式也是如此。谢谢。【参考方案2】:

需要注意的另一件事是,如果您启用了 CSRF 中间件,它会重复发布类似这样的尝试。

【讨论】:

我好像没有启用那个中间件。 是的。我想我会把它扔在那里,以防其他人遇到这个问题并因此而被绊倒。

以上是关于YUI.io (ajax) 和 Django - 更新只能工作一次,YUI 无法再次找到表单的主要内容,如果未能解决你的问题,请参考以下文章

Django之ajax的数据传输和分页器

Django之ajax的数据传输和分页器

django为啥不能实现ajax

Django 和 Ajax 管理

使用 ajax 和 django 传递信息

Django:ajax 和请求