2012-10-25 6 views
0

model.save() 메서드를 호출하면 My BackboneJS 모델에서 PUT 대신 GET을 전송합니다. REST API를 위해 장고 티맥 (django-tastypie)이있는 장고 백엔드가 있습니다.BackboneJS는 PUT 대신 GET 보내기를 저장합니다.

예를 들어, 나는 다음과 같이 업데이트하려고 사용자 모델이 있습니다

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

를 I 콘솔에서 다음과 같은 오류 얻을 :

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

내가 t.save()이있는 줄을

내가 여기서 잘못하고있는 것이 있습니까?

편집

좋아, 그가 라인 console.log(e)은 다음과 같다하는 int 보여줍니다 메시지 :이 문제가 장고 - Tastypie과하지 BackbonejS와 것을 의미합니까

"{"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"}" 

? 아직도이 GET은 내가 추측하는 문제입니다!

+2

'me.fetch'이 (이)를 유발할 수 있습니다. –

+0

더 자세히 설명해 주시겠습니까? –

+1

분명히 밝혀야합니다 :'me.fetch'의 원래'GET'이 성공 했습니까? – JayC

답변

1

save 메소드는 두 개의 인수를 취합니다. 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

fetch 호출에 오류 콜백을 추가하여 서버 오류를 반환하는 GET 요청을 가져 오지 않도록 할 수 있습니다. 또한 모델 속성으로'error'와'success'를 가진 모델을 저장하는 것처럼 보이고, Andrei Rosca의 응답으로 저장 호출을 수정합니다. –

+0

Andrei가 설명하는 것처럼 정확히했는데, 어떻게 든 개발 서버에서 작동했지만 여전히 프로덕션 하나 (Heroku)에서 같은 문제가 있습니다 ... –

관련 문제