做项目的时候纠结了一下,找到django.http.request里面看了一下,发现199行写着:def_load_post_and_files(self):"""Populateself._postandself._filesifthecontent-typeisaformtype"""ifself.method!='POST':self._post,self._files=QueryDict('',encoding=self._encoding),MultiValueDict()return这意味着只有POST才有request.POST这个表单信息。否则都是空的。。我只能自己hack了一下。。为什么Django不打算处理PUT的表单信息呢?我试了一下http://httpbin.org/put的接口,好像它就会处理。。。难道PUT的表单不符合标准么?
2 回答
拉丁的传说
TA贡献1789条经验 获得超8个赞
Django是基于页面表单处理的框架Web页面表单的form只支持GET和POST:参考只有POST方法可以传递文件,所以Django进行了那样的处理PUT方法一般用于RESTful风格的接口中,Django目前没有太好的支持
PIPIONE
TA贡献1829条经验 获得超9个赞
最近刚好做了一个Django+React的Todo程序,也遇到了同样的问题,我的代码如下,供你参考:fromdjango.viewsimportViewfromdjango.httpimportJsonResponse,QueryDictfromdjango.utilsimporttimezonefrom.modelsimportTodoclassTodoView(View):defpost(self,request):form=request.POSTtodo=Todo(content=form['content'],time=timezone.now())todo.save()resp=JsonResponse({'result':'success'})resp['Access-Control-Allow-Origin']='*'returnrespdefget(self,request):todos=Todo.objects.all()resp=JsonResponse({'result':'success','todos':[todo.toJSON()fortodointodos]})resp['Access-Control-Allow-Origin']='*'returnrespclassTodoItemView(View):defdelete(self,request,todo_id):todo=Todo.objects.get(id=todo_id)todo.delete()resp=JsonResponse({'result':'success'})resp['Access-Control-Allow-Origin']='*'returnrespdefput(self,request,todo_id):todo=Todo.objects.get(id=todo_id)put=QueryDict(request.body,encoding=request.encoding)todo.status=put.get('status')todo.save()resp=JsonResponse({'result':'success'})resp['Access-Control-Allow-Origin']='*'returnrespdefget(self,request,todo_id):todo=Todo.objects.get(id=todo_id)resp=JsonResponse({'result':'success','todo':todo.toJSON()})returnrespdefoptions(self,request,todo_id):todo=Todo.objects.get(id=todo_id)resp=JsonResponse({'result':'success'})resp['Access-Control-Allow-Origin']='*'resp['Access-Control-Allow-Methods']='GET,POST,PUT,DELETE,OPTIONS'returnresp
添加回答
举报
0/150
提交
取消