5

私はBackbone.jsを初めて使用し、モデルインスタンスを保存しようとしています。サーバーとしてdjangoを使用しています。

クライアント側コード:

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に設定して簡単に修正しました。しかし、バックボーン(0.9.2)コードのコメントによると、これはレガシーサーバーを対象としています。私はDjango1.4.1を使用しています。django 1.4.1に互換性がないということですか?

アップデート2:に設定Backbone.emulateJSONするとfalse、Firefoxで次のエラーが発生しますが、Chromeではサイレントに失敗します。

   "[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]"

Backboneで優先されるようにajaxにjQueryを使用していますが、jQueryにエラーがある可能性があります。

アップデート3:Backbone.syncで使用されている$.ajaxを自分のものでオーバーライドすることで解決しました。それはまだ簡単な修正です。

Backbone.jsバージョン:0.9.2

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

4

2 に答える 2

9

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

余談ですが、設定Backbone.emulateJSON = true;が機能する理由は、BackboneがJSONを「レガシー」メカニズムを介してDjangoに送信し、request.POSTQueryDictに表示されるためです。

于 2013-04-11T04:16:33.537 に答える
1

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

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

ここでBackbone.syncメソッドを見ることができます。モデルの属性が文字列化されていることに気付くでしょう。

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));
  }
}

他のいくつかの行で、BackboneがPOSTQueryDictに「model」キーを追加していることに気付くでしょう。

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

この行を次のように編集します。

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

それでおしまい!これで、request.POSTQueryDictの一部としてデータが作成されます。

于 2014-09-08T18:59:01.520 に答える