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 无法再次找到表单的主要内容,如果未能解决你的问题,请参考以下文章