невозможно обновить (PUT) и удалить (удалить) данные в Django-поршне - PullRequest
2 голосов
/ 16 ноября 2011

Я только что последовал этому уроку, и пример отличный. http://weblog.mattdorn.com/content/restful-web-apps-with-django-piston-and-ext-js/

но когда я создаю сам, метод add работает нормально, а удаление и обновление - нет. Вот консоль моего runserver:

[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

Я думаю, что он удаляет и обновляет данные, но вызывает их снова, чтобы не было никаких изменений. и когда я запускаю debug для своего 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 голосов
/ 12 декабря 2011

Убедитесь, что в URL-адресе запроса вставлены завершающие косые черты.

Прямо сейчас, поскольку завершающий слеш отсутствует, Django автоматически перенаправляет ваш запрос на адрес, который включает в себя завершающий слеш - ив этом случае запросы преобразуются в «GET», а не в «PUT» или «DELETE».

Это может быть ошибкой в ​​Django, но вы можете легко обойти это, включив завершающийслэш.

...