我有一个简单的html页面,它提供了许多几乎相同的表单供用户提交。提交后,视图旨在向数据库添加一行,重新创建具有稍微更新数据的表单列表,并将其发送回浏览器('/ route / complete /'映射到urls.py中的add_completed_route_view)。 / p>
第一次完美无缺。但是,一旦使用新的表单列表重新绘制页面,下一次提交将无法通过视图中的request.is_ajax()测试。这导致它跳过request.REQUEST ['next'],然后跳到home_view。
我在下面对此进行了评论,但我也尝试将c ['HTTP_X_REQUESTED_WITH'] ='XMLHttpRequest'附加到视图中,但它没有帮助。
我正在寻求帮助,确保在用户通过AJAX提交时,标头继续具有相应的XMLHttpRequest参数。代码如下,非常感谢帮助。
script.js
<script>
$(document).ready(function() {
$(".doneForm").submit(function() {
var route_id = $(this).find('input[name=route_id]').val()
var next = $(this).find('input[name=next]').val()
var reqData = {route_id:route_id,next:next}
$.ajax({
type: "post",
url: "/route/complete/",
data: reqData,
success: function(data) {
$("#routeTable").html(data);
}
});
return false;
});
});
</script>
和
template.html
<div id="routeTable">
{% for route in route_list %}
<div id="routeDone">
<form class="doneForm" action="/route/complete/" method="post">
<input type="hidden" name="route_id" value="{{ route.route_id }}" />
<input type="hidden" name="next" value="{{ request.get_full_path }}" />
<input type="submit" value="Done" class="doneButton" />
</form>
</div>
{% endfor %}
</div>
和
views.py
def add_completed_route_view(request):
if request.method == 'POST' and request.user.is_authenticated():
add_completed_route(request)
if request.is_ajax():
wall_slug = get_wall_slug_from_route_id(request.REQUEST['route_id'])
c = get_context_for_wall_page(request, wall_slug)
# c['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
return render_to_response('m/js_route_table.html', c, context_instance=RequestContext(request))
else:
return HttpResponseRedirect(request.REQUEST['next'])
else:
return HttpResponseRedirect(reverse('home_view'))
答案 0 :(得分:3)
问题在于,一旦Ajax完成,它就会用新的表单替换原始表单 - 而且这个表单不再附加javascript事件处理程序,因此下次表单通过普通的POST方法提交时。
幸运的是,jQuery有几种方法可以帮助您解决这个问题 - live
和delegate
。因此,请执行以下操作,而不是$(".doneForm").submit(function() ...
:
$(".doneForm").live("submit", function() {...