如何在tastypie中修改POST请求?

时间:2013-12-23 15:44:28

标签: tastypie jquery-datatables

我在服务器端使用tastypie0.10.0,在客户端使用jquery.datatables.editable2.3.3。 我的问题是如何将{columnName:value}对象插入tastypie以更新记录,因为可编辑插件将表单数据发送为

值:textEntered
ID:628
COLUMNNAME:LONG_NAME
ROWID:0
columnPosition:4
columnId:4

我哪里出错了?请帮助
这是我的datatables.makeEditable代码

 $('#table_id').dataTable().makeEditable({
        sAddURL: "/api/v1/project/?format=json",
        sDeleteURL: "/api/v1/project/?format=json",
        sUpdateURL:  "/api/v1/project/?format=json",
        sDeleteHttpMethod : "DELETE",

});  

和tastypie代码

class ProjectResource(ModelResource):
    class Meta:
        always_return_data = True
        queryset = Project.objects.all()
        resource_name = 'project'
        authorization= Authorization()
        paginator_class = Paginator
        default_format = "application/json"
        serializer = urlencodeSerializer()
        detail_allowed_methods = ['get', 'post', 'put', 'delete','patch']
        excludes =["slug","supervisor","client_id"]
        filtering = {
            #'date_created' : 'icontains',
            'initials' : 'iexact',
            'short_name':['icontains','istartswith','exact'],
            'id' :'exact',
            'long_name':['icontains','istartswith','exact'],
        }

        def obj_update(self, bundle, request, **kwargs):
            bundle = super(ProjectResource, self).obj_update(bundle, request,**kwargs)
                cn = bundle.request.POST.get('columnName')
                v = bundle. request.POST.get('value')
                foo ={cn:v}
                bundle = self.build_bundle(data=foo,request=request,**kwargs)
                bundle.obj.save()
            return bundle

2 个答案:

答案 0 :(得分:0)

假设cn不是None,那怎么样,

    def obj_update(self, bundle, request, **kwargs):
        base_bundle = super(ProjectResource, self).obj_update(bundle, request,**kwargs)
        foo = base_bundle.request.POST.copy()
        cn = foo.pop('columnName')
        v = foo.pop('value')
        foo.update({cn:v})
        bundle = self.build_bundle(data=foo,request=request,**kwargs)
        bundle.obj.save()
        return bundle

答案 1 :(得分:0)

我遇到了一个解决方案,我不完全确定它是正确的方法。但是它的工作原理是至少保存对象并在客户端更新表...这是一个没有错误处理的最小工作代码和其他检查,(如果我错过任何东西,请指导我)。

def hydrate(self, bundle):
    cn = bundle.request.POST.get('columnName')
    v = bundle.request.POST.get('value')
    setattr(bundle.obj, cn, v) # this works
    #bundle.data[cn]=v # this also works 
    #bundle.obj.save() # no need to call save 
    return bundle  

然而,我正在考虑更新而不是创建,我之所以尝试使用 obj_update 。现在我迷失了应该采取的方法,以及如何我可以从datatables.makeEditable()发出 PATCH 请求。我试过传递aoColumn:[....,{“method”:“PUT”},...]但是
浏览器将请求报告为POST。

  

请求方法:POST
  状态代码:201 CREATED

修改
仍然坚持这个。水合物解决方案更新表格单元格,但将所有其他字段更改为其默认值。这意味着它正在创建行而不是更新它。

我不确定它的jquery.datatables.editable问题还是tastypie问题 有人请帮忙。