2012-08-30 21 views
5

私はBackbone.jsが新しく、モデルインスタンスを保存しようとしています。 私はサーバーとしてdjangoを使用しています。Backbone.jsモデルデータを保存する。データが正しく送信されない

クライアント側コード:データが送信される前に

var Song = Backbone.Model.extend({ 
    defaults: { 
     name: 'New Song' 
    }, 
    url: function() { 
     return window.location.href; 
    } 

}); 

var song = new Song() 
song.save() 

csrfmiddlewaretokenが正しく設定されています。

Backbone.syncによって内部的に呼び出されたjQuery $ .ajax関数を実行し、モデルオブジェクトに正しいデータが含まれていることがわかりました。

しかし、サーバによって受信request.POSTではなく、実際のデータの

POST:<QueryDict: {u'[object Object]': [u'']}> 

あります。私がどこに間違っているのか?

更新:Backbone.emulateJSONをtrueに設定して迅速に修正しました。しかし、Backbone(0.9.2)コードのコメントによれば、これは従来のサーバー向けのものです。私はDjango 1.4.1を使用しています。 django 1.4.1と互換性がないということですか?

アップデート2:私はfalseBackbone.emulateJSONを設定すると、私はFirefoxで次のエラーを取得するが、それはクロームで静かに失敗しました。

"[Exception... "Component returned failure code: 0x80460001 
(NS_ERROR_CANNOT_CONVERT_DATA)" nsresult: "0x80460001 (NS_ERROR_CANNOT_CONVERT_DATA)" 

    location: "JS frame :: http://localhost:8000/static/jquery.js :: <TOP_LEVEL> :: line 8214" data: no]" 

バックボーンにより好ましいと私は、AjaxのためのjQueryを使用したことだし、それはエラーがjQueryのであるかもしれないようです。

更新3:Backbone.syncで使用されている$ .ajaxを自分自身で上書きして解決しました。それはまだ迅速な修正です。

BACKBONE.JS verson:0.9.2

jQueryのバージョン:1.8.0。 1.7.2でも試しました。同じ結果。

+0

ネットワークパネルを見て、サーバーに送信されているデータを確認できますか。私はDjangoに慣れていませんが、あなたの問題は間違いなくサーバ側の問題であり、Backboneでは問題ではないようです。 – TYRONEMICHAEL

+0

@TyroneMichael提案をいただきありがとうございます。クロムのネットワークパネルは、モデルが要求ペイロードのプレーンオブジェクトとして送信されることを示しています。しかしfirefoxでは、私はUpdate 2で書かれたエラーを受け取りました。 – Pramod

+0

データが文字列として送信されているとは思われません。(見てください。[http://communities.rightnow.com/posts/9580c78607]) Emulate JSONがfalseの場合にこのエラーが発生しますか? Emulate JSON = falseをコメントアウトするとFFで何が起こるのですか? – TYRONEMICHAEL

答えて

9

私は同様の問題を抱えていましたが、何らかの探偵的な仕事/運を通して私はそれを理解しました。問題は、デフォルトでは、BackboneがPOSTデータを、request.POST QueryDictの一部ではなく、リクエスト本体にJSONエンコードされた文字列として送信することです。この場合、データを取得するには、python jsonライブラリを使用し、Djangoビューでjson.loads(request.body)を呼び出してデータを正しく読み込む必要があります。

Backbone.emulateJSON = true;を設定する理由は、BackboneがJSDONをQueryDictに表示させる「レガシー」メカニズムによってDjangoに送信するためです。

+0

...または古いバージョンのdjangoの場合は 'json.loads(request.raw_post_data)' –

1

QueryDict request.POSTでデータを使用できるようにするには、Backbone.syncメソッドをオーバーライドする必要があります。

まず、Backbone.emulateJSONをtrueに設定する必要があります。

Backbone.syncメソッドをhereより見ることができます。モデルの属性が文字列化されていることがわかります。

if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { 
    params.contentType = 'application/json'; 
    params.data = JSON.stringify(options.attrs || model.toJSON(options)); 
} 

編集する機能のこの部分:

if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { 
    params.contentType = 'application/json'; 
    if(options.emulateJSON){ 
    params.data = options.attrs || model.toJSON(options); 
    }else{ 
    params.data = JSON.stringify(options.attrs || model.toJSON(options)); 
    } 
} 

他のいくつかの行では、あなたがそのバックボーンに気づくでしょうがPOSTのQueryDictに「モデル」キーを追加します。

params.data = params.data ? {model: params.data} : {}; 

編集この行に:これだけ

params.data = params.data ? params.data : {}; 

!これで、リクエストの一部としてデータが取得されます.POST QueryDict。

関連する問題