wtorek, 8 marca 2011

django-piston: Przesyłanie dodatkowych parametrów POST do metody BaseHandler.create()

django-piston daje nam 4 podstawowe metody REST: read(), create(), update(), delete(). Są one bardzo proste i najczęściej musimy je nadpisać, aby uzyskać chciany przez nas efekt.

Metoda create() korzysta domyślnie tylko z parametrów przesłanych w POST (request.POST). Chcąc przesłać do niej dodatkowy parametr lub zmienić istniejący musimy nadpisać całą metodę (i tak kilka razy dla każdego Handlera używajacego create()). Chyba że nadpiszemy tą metodę raz (najlepiej w osobnym pliku, chociażby: libs.my_piston.handler.), aby przyjmowała dodatkowy słownik jako parametr funkcji i (jeżeli zostanie podany) dodała go do słownika pobranego z request.POST.

from piston.handler import BaseHandler
from piston.utils import rc
class DummyBaseHandler(BaseHandler):
'''
`DummyBaseHandler`
'''
model = None
def create(self, request, *args, **kwargs):
'''
Almost copy of `piston.handler.BaseHandler.create()`
It gets one more attribute: `attrs` (dict)
`attrs` contains fields for model. If it's not given simple `request.POST` is used.
'''
if not self.has_model():
return rc.NOT_IMPLEMENTED
attrs = self.flatten_dict(request.POST)
# my changes [start]
if 'attrs' in kwargs:
attrs.update(kwargs['attrs'])
# my changes [end]
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
class BaseHandler(DummyBaseHandler): pass

Teraz w naszym handlerze:

from piston.utils import validate
from libs.my_piston.handler import BaseHandler
from apps.task.models import Task
from apps.task.forms import TaskForm
class TaskBaseHandler(BaseHandler):
model = Task
class TaskHandler(TaskBaseHandler):
allowed_methods = ('POST',)
@validate(TaskForm)
def create(self, request, *args, **kwargs):
attrs = {
'user': request.user,
}
return super(TaskHandler, self).create(request, *args, attrs=attrs)
view raw task_handler.py hosted with ❤ by GitHub

Brak komentarzy:

Prześlij komentarz