aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/mixins.py
diff options
context:
space:
mode:
authorTom Christie2012-10-05 16:24:52 +0100
committerTom Christie2012-10-05 16:24:52 +0100
commit2533c2452b383771f80e6d40c93ae4a5ef6a8cf7 (patch)
tree9bf467db0f43bd921270850cb7f664cededd9388 /rest_framework/mixins.py
parent7218bcbadeac76a939e757bd0c4c336846548b51 (diff)
downloaddjango-rest-framework-2533c2452b383771f80e6d40c93ae4a5ef6a8cf7.tar.bz2
Support PUT for create
Diffstat (limited to 'rest_framework/mixins.py')
-rw-r--r--rest_framework/mixins.py27
1 files changed, 26 insertions, 1 deletions
diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py
index e3c7cf03..46821f64 100644
--- a/rest_framework/mixins.py
+++ b/rest_framework/mixins.py
@@ -71,13 +71,38 @@ class UpdateModelMixin(object):
Should be mixed in with `SingleObjectBaseView`.
"""
def update(self, request, *args, **kwargs):
- self.object = self.get_object()
+ try:
+ self.object = self.get_object()
+ except Http404:
+ self.object = None
+
serializer = self.get_serializer(data=request.DATA, instance=self.object)
if serializer.is_valid():
+ if self.object is None:
+ obj = serializer.object
+ # TODO: Make ModelSerializers return regular instances,
+ # not DeserializedObject
+ if hasattr(obj, 'object'):
+ obj = obj.object
+ self.update_urlconf_attributes(serializer.object.object)
self.object = serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
+ def update_urlconf_attributes(self, obj):
+ """
+ When update (re)creates an object, we need to set any attributes that
+ are tied to the URLconf.
+ """
+ pk = self.kwargs.get(self.pk_url_kwarg, None)
+ if pk:
+ setattr(obj, 'pk', pk)
+
+ slug = self.kwargs.get(self.slug_url_kwarg, None)
+ if slug:
+ slug_field = self.get_slug_field()
+ setattr(obj, slug_field, slug)
+
class DestroyModelMixin(object):
"""