2012-10-25 57 views
0

當我調用model.save()方法時,我的BackboneJS模型現在發送一個GET而不是PUT。 我有一個Django後端與django-tastypie的REST api。BackboneJS保存發送GET而不是PUT

例如,我有嘗試更新這樣一個用戶模型:

var me = new UserModel({ 
    id: this.user.id 
}); 
me.fetch({ 
    success: function (t) { 
     console.log(t); 
     t.set({ 
      'premium': true 
     }); 
     t.save({ 
      success: function() { 
       alert('success') 
      }, 
      error: function (m, e) { 
       console.log(e); 
      } 
     }); 
    } 
}) 

我在控制檯中出現以下錯誤:

GET http://127.0.0.1:8000/api/v1/users/100003258103084/ 500 (INTERNAL SERVER ERROR) 

在那裏我有t.save()

有什麼我在這裏做錯了嗎?

編輯

好吧,它顯示詮釋他的線console.log(e)是如下消息:

"{"error_message": "int() argument must be a string or a number, not 'dict'", "traceback": "Traceback (most recent call last):\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/resources.py\", line 192, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/resources.py\", line 406, in dispatch_detail\n return self.dispatch('detail', request, **kwargs)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/resources.py\", line 427, in dispatch\n response = method(request, **kwargs)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/resources.py\", line 1131, in put_detail\n updated_bundle = self.obj_update(bundle, request=request, **self.remove_api_resource_names(kwargs))\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/resources.py\", line 1827, in obj_update\n m2m_bundle = self.hydrate_m2m(bundle)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/resources.py\", line 743, in hydrate_m2m\n bundle.data[field_name] = field_object.hydrate_m2m(bundle)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/fields.py\", line 742, in hydrate_m2m\n m2m_hydrated.append(self.build_related_resource(value, **kwargs))\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/fields.py\", line 593, in build_related_resource\n return self.resource_from_data(self.fk_resource, value, **kwargs)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/fields.py\", line 548, in resource_from_data\n return fk_resource.obj_update(fk_bundle, **data)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/resources.py\", line 1814, in obj_update\n bundle.obj = self.obj_get(request, **lookup_kwargs)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/tastypie/resources.py\", line 1752, in obj_get\n base_object_list = self.get_object_list(request).filter(**kwargs)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/query.py\", line 621, in filter\n return self._filter_or_exclude(False, *args, **kwargs)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/query.py\", line 639, in _filter_or_exclude\n clone.query.add_q(Q(*args, **kwargs))\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/sql/query.py\", line 1250, in add_q\n can_reuse=used_aliases, force_having=force_having)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/sql/query.py\", line 1185, in add_filter\n connector)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/sql/where.py\", line 69, in add\n value = obj.prepare(lookup_type, value)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/sql/where.py\", line 320, in prepare\n return self.field.get_prep_lookup(lookup_type, value)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/fields/related.py\", line 137, in get_prep_lookup\n return self._pk_trace(value, 'get_prep_lookup', lookup_type)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/fields/related.py\", line 210, in _pk_trace\n v = getattr(field, prep_func)(lookup_type, v, **kwargs)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py\", line 310, in get_prep_lookup\n return self.get_prep_value(value)\n\n File \"/home/mohamed/code/skempi/venv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py\", line 537, in get_prep_value\n return int(value)\n\nTypeError: int() argument must be a string or a number, not 'dict'\n"}" 

這是否意味着問題出在Django的Tastypie而不是與BackbonejS?仍然這GET是我猜的問題!

+2

看起來像'me.fetch'可能會觸發這個 –

+0

請您再詳細說明一下嗎? –

+1

需要說明的是:'me.fetch'的原始'GET'是否成功? – JayC

回答

1

save方法需要2個參數:model.save([attributes],[options]) - 都是可選的。

現在您正在傳遞選項散列而不是屬性。嘗試:

t.save(t.attributes, { 
    success: function() { 
     alert('success') 
    }, 
    error: function (m, e) { 
     console.log(e); 
    } 
}); 

t.save({'premium':true}, { 
    success: function() { 
     alert('success') 
    }, 
    error: function (m, e) { 
     console.log(e); 
    } 
}); 
0

似乎me.fetch發送GET請求。 Backbone中沒有任何東西會在保存時發出GET請求,除非您已覆蓋默認的同步方法。

只保存POST或PUT請求(如果模型沒有ID和PUT,則POST)否則。

+0

這行看到模型的細節。我沒有重寫Backbonejs的同步方法。 –

+0

您可能會嘗試將錯誤回調添加到獲取調用,以確保這不會執行獲取請求以返回服務器錯誤。另外,您似乎將'error'和'success'作爲模型屬性來保存模型,並按照Andrei Rosca的回答修復save調用。 –

+0

我的確如Andrei所描述的那樣,它在開發服務器上工作過,但在生產環境中仍然有相同的問題(在Heroku上)... –

相關問題