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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
Brak komentarzy:
Prześlij komentarz