Ajax驱动的表单提交仅工作一次Django

时间:2011-12-12 09:57:52

标签: jquery ajax django django-views

我有这个博客应用程序,我想提供一个预览按钮,保存表单,然后在新窗口中打开博客。 javascript就是

  $(function() {
    var current_link = location.href;

    $(".preview_button").click(function() 
    {           
        $.ajax({
          type: "POST",
          url: current_link,
          data: $("#blog_form").serialize(),
          dataType: 'json',
          success: function(data) 
          {
            window.open(data,'preview_tab');
            $("#reply-message").html('Form saved');
          },
          error: function(request,error) 
          {
            $("#reply-message").html('Form not saved because error:' + error);
          },

        });

        return false;   
    });
  }

);

我在views.py中将其处理为

 if request.is_ajax():
        if request.method == 'POST':

            author = User.objects.get(pk=author_id)
            blog = get_object_or_404(Entry, creator = author, slug = slug)

            title = request.POST.get('title', False)
            text = request.POST.get('text', False)
            tags = request.POST.get('tags', False)
            enable_comments = request.POST.get('enable_comments', False)

            blog.title = title
            blog.text = text
            blog.tags = tags
            blog.enable_comments = enable_comments

            blog.save()

            return_message = '/blogs/' + str(blog.creator.id) + '/' + str(blog.slug) + '/' + 'preview/' 
            return HttpResponse(simplejson.dumps(return_message),mimetype='application/javascript')

return_message包含预览页面的网址,用于在新窗口中打开它。我有两个问题

  1. 表单只提交一次,使用此javascript,再次提交我必须刷新页面。
  2. 其次,除了textarea之外,博客的所有字段都在更新。我不明白为什么会发生这种情况
  3. 编辑:问题原因

    1. 第一个问题是因为我在序列化表单时发送了相同的csrf令牌,所以有没有办法可以从序列化函数中删除这个令牌?

    2. 第二个问题是因为我在文本区域使用TinyMCE编辑器,当我在编辑器中输入内容时,更改不会反映回实际文本框。如何从文本编辑器中选择文本,而不是从底层(最可能)隐藏文本区域中选择文本

1 个答案:

答案 0 :(得分:2)

问题1听起来可能与Django的内置CSRF protection有关。尝试使用CharlesFirebug等工具检查HTTP请求,并检查是否发送了两次相同的CSRF令牌。除非已为视图明确禁用CSRF保护,否则表单提交将在第二次被拒绝,除非令牌已更新。

The docs有一节关于在Ajax代码中处理这个问题。

虽然我不能肯定地说,也许问题2可能与jQuery的选择过程有关,它在序列化时包含哪些字段。来自their docs

  

注意:只有“成功控件”被序列化为字符串。没有   由于表单未提交,因此提交按钮值已序列化   使用按钮。对于要包含在表单元素中的值   序列化字符串,该元素必须具有name属性。价值来自   复选框和单选按钮(“radio”或“checkbox”类型的输入)   仅在检查时才包括在内。来自文件选择元素的数据   没有序列化。