【问题标题】:BackboneJS save sending GET instead of PUTBackboneJS 保存发送 GET 而不是 PUT
【发布时间】:2012-10-25 22:43:46
【问题描述】:

当我调用 model.save() 方法时,我的 BackboneJS 模型现在发送 GET 而不是 PUT。 我有一个带有 django-tastypie 的 Django 后端,用于 REST api。

例如,我有一个用户模型,我尝试像这样更新:

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 仍然是问题!

【问题讨论】:

  • 看起来me.fetch 可能会触发这个
  • 您能详细说明一下吗?
  • 要明确一点:来自me.fetch 的原始GET 是否成功?
  • @JayC:是的,我可以在console.log(t)这一行看到模型的详细信息

标签: django backbone.js tastypie


【解决方案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);
    }
});

【讨论】:

    【解决方案2】:

    me.fetch 似乎发送了 GET 请求。除非您覆盖了默认同步方法,否则 Backbone 中没有任何内容会在保存时发出 GET 请求。

    Save 仅执行 POST 或 PUT 请求(如果模型没有 id 则为 POST,否则为 PUT)。

    【讨论】:

    • 顺便说一句,我没有覆盖Backbonejs的同步方法。
    • 您可以尝试在 fetch 调用中添加错误回调,以确保这不是 fetch 执行返回服务器错误的 GET 请求。此外,您似乎使用 errorsuccess 作为模型属性保存模型,按照 Andrei Rosca 的回答修复保存调用。
    • 我完全按照 Andrei 的描述做了,它以某种方式在开发服务器中工作,但我在生产服务器(在 Heroku 上)仍然遇到同样的问题......
    猜你喜欢
    • 2014-03-14
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多