1
- from django .forms .models import modelform_factory
1
+ from django .forms .models import modelform_factory , model_to_dict
2
2
3
3
from .views import Endpoint
4
4
from .http import HttpError , Http200 , Http201
11
11
def _get_form (form , model ):
12
12
from django import VERSION
13
13
14
- if VERSION [:2 ] >= (1 ,8 ):
15
- mf = lambda m : modelform_factory (m , fields = '__all__' )
14
+ if VERSION [:2 ] >= (1 , 8 ):
15
+ def mf (model ):
16
+ return modelform_factory (model , fields = '__all__' )
16
17
else :
17
18
mf = modelform_factory
18
19
@@ -95,7 +96,7 @@ def post(self, request, *args, **kwargs):
95
96
if form .is_valid ():
96
97
obj = form .save ()
97
98
return Http201 (self .serialize (obj ))
98
-
99
+
99
100
raise HttpError (400 , 'Invalid Data' , errors = form .errors )
100
101
101
102
@@ -120,7 +121,7 @@ class variable.
120
121
model = None
121
122
form = None
122
123
lookup_field = 'pk'
123
- methods = ['GET' , 'PUT' , 'DELETE' ]
124
+ methods = ['GET' , 'PUT' , 'PATCH' , ' DELETE' ]
124
125
125
126
def get_instance (self , request , * args , ** kwargs ):
126
127
"""Return a model instance represented by this endpoint.
@@ -169,6 +170,28 @@ def get(self, request, *args, **kwargs):
169
170
170
171
return self .serialize (self .get_instance (request , * args , ** kwargs ))
171
172
173
+ def patch (self , request , * args , ** kwargs ):
174
+ """Update the object represented by this endpoint."""
175
+
176
+ if 'PATCH' not in self .methods :
177
+ raise HttpError (405 , 'Method Not Allowed' )
178
+
179
+ Form = _get_form (self .form , self .model )
180
+ instance = self .get_instance (request , * args , ** kwargs )
181
+
182
+ form_data = model_to_dict (instance )
183
+ form_data .update (request .data )
184
+
185
+ form = Form (
186
+ form_data ,
187
+ request .FILES ,
188
+ instance = instance
189
+ )
190
+ if form .is_valid ():
191
+ obj = form .save ()
192
+ return Http200 (self .serialize (obj ))
193
+ raise HttpError (400 , 'Invalid data' , errors = form .errors )
194
+
172
195
def put (self , request , * args , ** kwargs ):
173
196
"""Update the object represented by this endpoint."""
174
197
@@ -177,8 +200,7 @@ def put(self, request, *args, **kwargs):
177
200
178
201
Form = _get_form (self .form , self .model )
179
202
instance = self .get_instance (request , * args , ** kwargs )
180
- form = Form (request .data or None , request .FILES ,
181
- instance = instance )
203
+ form = Form (request .data or None , request .FILES , instance = instance )
182
204
if form .is_valid ():
183
205
obj = form .save ()
184
206
return Http200 (self .serialize (obj ))
0 commit comments