【问题标题】:Ajax powered form submission working only once DjangoAjax 支持的表单提交只工作一次 Django
【发布时间】:2012-01-18 08:14:19
【问题描述】:

我有这个博客应用程序,我想在其中提供一个预览按钮,用于保存表单,然后在新窗口中打开博客。用于此的 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包含预览页面的url,用于在新窗口中打开。我有两个问题

  1. 表单仅提交一次,使用此 javascript,要再次提交,我必须刷新页面。
  2. 其次,博客的所有字段都在更新,除了 textarea。我不明白为什么会发生这种情况

编辑:问题原因

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

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

【问题讨论】:

  • 抱歉,不知道,但您可能希望在错误处理程序之后删除尾随逗号 - 有些浏览器不喜欢它。也许您可以发布一些 HTML?

标签: jquery ajax django django-views


【解决方案1】:

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

The docs 有一节介绍如何在 Ajax 代码中处理此问题。

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

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

【讨论】:

  • 我认为第一个问题是因为相同的 csrf 令牌被发送了两次。当我序列化表单时,csrf 令牌也被序列化,并且由于页面没有重新加载,所以 csrf 令牌是相同的。既然我已经添加了你指向我的 javascript 文件,你能告诉我如何从序列化数据中删除 csrf 令牌
  • 至于第二个问题,文本区域确实有一个 name 属性,所以问题不应该是因为这个,但是文本区域有一个 class="mceEditor" 这使它成为一个 TinyMCE 编辑器所以可以造成问题???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
相关资源
最近更新 更多