2017-08-27 19 views
0

也許這是我的一部分壞序列化的問題,但我有問題,我的數據反序列化:反序列化的查詢字符串的QueryDict(通過AJAX發送)

我發送的ModelForm通過AJAX(由POST)至一個看法。沒有錯誤,但保存的ModelForm在我的模型中創建了一個空項目。

我已檢查調試器request.POST:沒有對應於什麼是由AJAX發出的密鑰,但它不是一個的QueryDict但形式的字符串:

request.POST['keyinrequestpost'] = 'csrfmiddlewaretoken=pA.....zutQ&FirstField=BlaBlad&SecondField=BlaBla&ThirdField=BlaBla'

顯然,這樣做則:

MyModelForm(request.POST['keyinrequestpost'])

不工作(創建項目只拿到了空字段),因爲它不是一個的QueryDict? 我以爲轉換是自動的?

我該如何反序列化以獲得QueryMode可用於MyModelForm()?

我的AJAX:

$(document).ready(function(){ 
$('#newword_form').bind('submit', function(e){ 
    var newword_form = $('#newword_form') 
    newword_form_serialized = newword_form.serialize(); 
    $.ajax({url: '/create_newword/', 
      type: 'POST', 
      dataType: 'json', 
      data:{csrfmiddlewaretoken: '{{ csrf_token }}', 
       'newword': newword_form_serialized } , 
      success: function(data){ 
      ... 

和我的觀點:

if 'newword' in request.POST.keys(): # the form has been posted 
     f = MyModelForm(request.POST['newword']) 
     if f.is_valid(): 
      word = f.save() 
      return render(request, ... 

回答

0

你並不需要發送的csrf_token這種方式。如果它在你的表格內; 這就是它應該是,那麼你可以簡單地序列化表單併發送它的數據。

在序列化,在CSRF令牌和所有表單數據將被包含在一個字典和發送到服務器。然後,您可以在視圖內簡單地訪問它。

試試這個(JavaScript的):

//var url = your url; 
$.ajax({ 
     url : url, 
     type : 'POST', 
     dataType: 'json', 
     data: $('form#newword_form').serialize(), 
     success : function(data, status, xhr){ 
      //success 
     }, 
     error : function(data , status , xhr){ 
      //error 
     } 
}); 

然後在你的views.py:

f = MyModelForm(request.POST) 

會工作得很好。

如果沒有,請告訴我。

其他注意事項:我希望你的HTML看起來有點像這樣:

<form method="post"> 
     {% csrf_token %} 
     <h4>Form Title</h4> 
     {{ form.as_p }} 
     <button type="submit">Submit</button> 
</form> 

希望這有助於。謝謝。

+0

精彩的回答!非常感謝您的時間。而Ajax中的'錯誤'部分爲我解決了更多問題。 – ThePhi

相關問題