我的对象有一个编辑页面。因为我已将数据划分为两个选项卡,所以我使用 jquery-ui。在第一个选项卡 (#core_data
) 上,我正在加载对象的主要数据。表单通过 Ajax 提交:
<form method="post" class="object_form" id="event-core-form" action="{% url edit_event_data event.id %}" enctype="multipart/form-data">
{{ form.as_p }}
<p>
<input class="object-submit" id="event-data-save" type="submit" value="Save data">
</p>
</form>
js:
$("#event-data-save").livequery("click", function() {
$("#event-core-form").ajaxSubmit({
"success": function(data) {
data = JSON.parse(data)
$("#core-data").html(data["form"]);
}
});
return false;
})
并且运行了一个函数,我的调试显示它立即被调用了两次:
def edit_event_data(request, event_id,):
template_name="management/core_event.html"
event = get_object_or_404(Event, pk=event_id)
form = EventForm(instance=event, data=request.POST)
if form.is_valid():
form.save()
form = EventForm(instance=event)
form_html = render_to_string(template_name, RequestContext(request, {
"event" : event,
"form" : form,
}))
result = simplejson.dumps({
"form": form_html,
"message": "Data saved."
}, cls=LazyEncoder)
return HttpResponse(result, mimetype='application/javascript')
此外,成功提交后,再次点击“保存”会给我呈现一个原始表单:/这是我正在使用的表单。我认为这可能是我出现问题的原因:
class EventForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
logging.debug("form - init")
super(EventForm, self).__init__(*args, **kwargs)
(...)
def save(self, *args, **kwargs):
(...)
logging.debug("form - save")
post = super(EventForm, self).save(*args, **kwargs)
post.save()
因为在我的调试中我可以看到我想了太多 __init__'s
2010-10-28 23:35:08,210 DEBUG form - init
2010-10-28 23:35:34,065 DEBUG form - init
2010-10-28 23:35:34,068 DEBUG form - save
2010-10-28 23:35:34,073 DEBUG form - init
2010-10-28 23:35:34,258 DEBUG form - init
2010-10-28 23:35:34,262 DEBUG form - save
2010-10-28 23:35:34,270 DEBUG form - init
有人可以帮忙吗?
<小时/>编辑:
删除 jquery-ui 后仍然一样。删除 livequery 也不会给出任何结果。
最佳答案
为什么在保存原始表单后要实例化一个新表单?
if form.is_valid():
form.save()
# what's the point of the next line?
form = EventForm(instance=event)
这几乎肯定是重复 __init__
调用的原因。你为什么这么做?您已经有了一个表格。
此外,您还忘记停止在 JS 中完成点击操作。
$("#event-data-save").livequery("click", function(e) {
e.preventDefault();
...
})
关于jquery - 双倍的 POST 请求而不是单一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047996/