我在服务器端使用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
答案 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问题 有人请帮忙。