2011-12-12 147 views
1

我有這個博客應用程序,我想給一個預覽按鈕,保存表單,然後在新窗口中打開博客。造成這種情況的JavaScript是Ajax動力表單提交只能工作一次Django

$(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編輯器,當我在編輯器中鍵入某些內容時,更改沒有反映回實際的文本框。我怎麼能在從文本編輯器中的文本,而不是從底層(最有可能)隱藏的文本區域

+0

對不起,不知道,但你可能想刪除錯誤處理程序後的尾隨逗號 - 有些瀏覽器不會喜歡它。也許你可以發佈一些你的HTML? – nnnnnn

回答

2

問題1聽起來像它可能與Django的內置CSRF protection。嘗試使用類似CharlesFirebug的工具檢查HTTP請求,並檢查是否發送了兩次相同的CSRF令牌。除非明確禁止CSRF保護視圖,否則表單提交將被第二次拒絕,除非令牌被更新。

The docs在Ajax代碼中有一個關於處理這個問題的章節。

儘管我不能肯定地說,問題2可能與jQuery的選擇過程有關,它在序列化時包含哪些字段。從their docs

注意:只有「成功的控件」被序列化爲字符串。沒有 提交按鈕值被序列化,因爲表單未提交 使用按鈕。對於要包含在 序列化字符串中的表單元素的值,元素必須具有name屬性。僅當檢查框中包含 複選框和單選按鈕(「收音機」或「複選框」類型的輸入) 的值。來自文件選擇元素 的數據未被序列化。

+0

我認爲第一個問題是因爲發送了兩次相同的csrf令牌。當我序列化表單時,csrf標記也被序列化,並且由於頁面沒有被重新加載,csrf標記是相同的。由於我已經添加了您指向我的JavaScript文件,您能告訴我如何從序列化數據中刪除csrf標記 – Sachin

+0

至於第二個問題,文本區域確實有名稱屬性,所以問題不應該是因此,但是文本區域有一個'class =「mceEditor」'它使它成爲一個TinyMCE編輯器,所以這可能會導致一個問題? – Sachin