无法在django-piston中更新(PUT)和删除(delete)数据
我刚刚跟着这个教程做,例子做得很好。http://weblog.mattdorn.com/content/restful-web-apps-with-django-piston-and-ext-js/
但是当我自己创建的时候,添加功能是可以的,但删除和更新功能就不行了。以下是我运行服务器时的控制台信息:
[16/Nov/2011 00:11:17] "DELETE /api/phonebooks/10 HTTP/1.1" 301 0
[16/Nov/2011 00:11:17] "GET /api/phonebooks/10/ HTTP/1.1" 200 255
[16/Nov/2011 00:11:23] "PUT /api/phonebooks/12 HTTP/1.1" 301 0
[16/Nov/2011 00:11:23] "GET /api/phonebooks/12/ HTTP/1.1" 200 253
我觉得它确实在删除和更新数据,但之后又重新调用数据,所以看起来没有任何变化。而且当我调试我的handlers.py时,它根本进不了更新的方法。
#handlers.py
from django.utils import simplejson
from piston.handler import BaseHandler
from piston.utils import rc, require_mime, require_extended, validate
from phonebook.phoneapp.models import Phonebook
from phonebook.phoneapp.forms import PhonebookForm
class PhonebookHandler(BaseHandler):
allowed_methods = ('GET', 'DELETE', 'POST', 'PUT')
fields = ('id','fullname','address','age','gender','phonenumber','user')
model = Phonebook
def create(self, request, *args, **kwargs):
if not self.has_model():
return rc.NOT_IMPLEMENTED
attrs = self.flatten_dict(request.POST)
if attrs.has_key('data'):
ext_posted_data = simplejson.loads(request.POST.get('data'))
attrs = self.flatten_dict(ext_posted_data)
try:
inst = self.model.objects.get(**attrs)
return rc.DUPLICATE_ENTRY
except self.model.DoesNotExist:
inst = self.model(**attrs)
inst.save()
return inst
except self.model.MultipleObjectsReturned:
return rc.DUPLICATE_ENTRY
def update(self, request, id):
if not self.has_model():
return rc.NOT_IMPLEMENTED
attrs = self.flatten_dict(request.POST)
if attrs.has_key('data'):
ext_posted_data = simplejson.loads(request.POST.get('data'))
attrs = self.flatten_dict(ext_posted_data)
inst = self.model.objects.get(id=id)
inst.fullname = attrs['fullname']
inst.address = attrs['address']
inst.gender = attrs['gender']
inst.age = attrs['age']
inst.phonebook = attrs['phonebook']
inst.save()
return inst
我也尝试过去掉allowed_methods
,但也没有任何效果。
有没有人能给我一些关于我这种情况的建议?谢谢大家!
1 个回答
0
确保在你的请求网址后面加上斜杠。
现在,因为缺少这个斜杠,你的请求会被Django自动转发到一个带斜杠的地址——在这种情况下,请求会变成'GET',而不是你最开始的'PUT'或'DELETE'。
这可能是Django的一个小问题,但你可以通过加上斜杠来轻松解决。