diff options
| author | Xavier Ordoquy | 2014-04-13 00:05:57 +0200 | 
|---|---|---|
| committer | Xavier Ordoquy | 2014-04-13 00:05:57 +0200 | 
| commit | d08536ad9d026fb7126c430f6d9c18f8540aacd6 (patch) | |
| tree | a8a1d36ce76867e57da23379694ea0609801990b /rest_framework/mixins.py | |
| parent | 2911cd64ad67ba193e3d37322ee71692cb482623 (diff) | |
| parent | 93b9245b8714287a440023451ff7880a2f6e5b32 (diff) | |
| download | django-rest-framework-d08536ad9d026fb7126c430f6d9c18f8540aacd6.tar.bz2 | |
Merge remote-tracking branch 'origin/master' into 2.4.0
Conflicts:
	.travis.yml
	docs/api-guide/fields.md
	docs/api-guide/routers.md
	docs/topics/release-notes.md
	rest_framework/authentication.py
	rest_framework/serializers.py
	rest_framework/templatetags/rest_framework.py
	rest_framework/tests/test_authentication.py
	rest_framework/tests/test_filters.py
	rest_framework/tests/test_hyperlinkedserializers.py
	rest_framework/tests/test_serializer.py
	rest_framework/tests/test_testing.py
	rest_framework/utils/encoders.py
	tox.ini
Diffstat (limited to 'rest_framework/mixins.py')
| -rw-r--r-- | rest_framework/mixins.py | 40 | 
1 files changed, 19 insertions, 21 deletions
| diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py index b62a4cc1..2cc87eef 100644 --- a/rest_framework/mixins.py +++ b/rest_framework/mixins.py @@ -11,6 +11,7 @@ from django.http import Http404  from rest_framework import status  from rest_framework.response import Response  from rest_framework.request import clone_request +from rest_framework.settings import api_settings  import warnings @@ -60,7 +61,7 @@ class CreateModelMixin(object):      def get_success_headers(self, data):          try: -            return {'Location': data['url']} +            return {'Location': data[api_settings.URL_FIELD_NAME]}          except (TypeError, KeyError):              return {} @@ -115,30 +116,27 @@ class UpdateModelMixin(object):          partial = kwargs.pop('partial', False)          self.object = self.get_object_or_none() -        if self.object is None: -            created = True -            save_kwargs = {'force_insert': True} -            success_status_code = status.HTTP_201_CREATED -        else: -            created = False -            save_kwargs = {'force_update': True} -            success_status_code = status.HTTP_200_OK -          serializer = self.get_serializer(self.object, data=request.DATA,                                           files=request.FILES, partial=partial) -        if serializer.is_valid(): -            try: -                self.pre_save(serializer.object) -            except ValidationError as err: -                # full_clean on model instance may be called in pre_save, so we -                # have to handle eventual errors. -                return Response(err.message_dict, status=status.HTTP_400_BAD_REQUEST) -            self.object = serializer.save(**save_kwargs) -            self.post_save(self.object, created=created) -            return Response(serializer.data, status=success_status_code) +        if not serializer.is_valid(): +            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) -        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +        try: +            self.pre_save(serializer.object) +        except ValidationError as err: +            # full_clean on model instance may be called in pre_save, +            # so we have to handle eventual errors. +            return Response(err.message_dict, status=status.HTTP_400_BAD_REQUEST) + +        if self.object is None: +            self.object = serializer.save(force_insert=True) +            self.post_save(self.object, created=True) +            return Response(serializer.data, status=status.HTTP_201_CREATED) + +        self.object = serializer.save(force_update=True) +        self.post_save(self.object, created=False) +        return Response(serializer.data, status=status.HTTP_200_OK)      def partial_update(self, request, *args, **kwargs):          kwargs['partial'] = True | 
