diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 7048d87de..4d9fc4673 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -360,6 +360,7 @@ class HTMLFormRenderer(BaseRenderer): request = renderer_context['request'] template = loader.get_template(self.template) + data = None if data.empty else data context = RequestContext(request, {'form': data}) return template.render(context) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 43d339da0..3ff94ecdf 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -342,6 +342,7 @@ class BaseSerializer(WritableField): """ ret = self._dict_class() ret.fields = self._dict_class() + ret.empty = obj is None for field_name, field in self.fields.items(): if field.read_only and obj is None: diff --git a/rest_framework/tests/test_issue_1237.py b/rest_framework/tests/test_issue_1237.py new file mode 100644 index 000000000..550c5ea34 --- /dev/null +++ b/rest_framework/tests/test_issue_1237.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# This is based on https://github.com/kevin-brown/django-rest-framework/compare/issue_1237. +from __future__ import unicode_literals + +from django.test import TestCase +from rest_framework.compat import patterns, url +from rest_framework.generics import GenericAPIView +from rest_framework.renderers import BrowsableAPIRenderer +from rest_framework.response import Response +from rest_framework.serializers import Serializer, HyperlinkedRelatedField +from rest_framework.tests.models import Album + + +class TestSerializer(Serializer): + field = HyperlinkedRelatedField(queryset=Album.objects, view_name="") + + +class TestView(GenericAPIView): + renderer_classes = (BrowsableAPIRenderer, ) + serializer_class = TestSerializer + + def post(self, request, **kwargs): + return Response("text") + + +urlpatterns = patterns('', + url(r"^view/(?P\d+)$", TestView.as_view(), name="view"), +) + + +class FailingTestCase(TestCase): + urls = 'rest_framework.tests.test_issue_1237' + + def test_issue_1237(self): + album = Album(title="test") + album.save() + + response = self.client.post("/view/{0}".format(album.pk)) + self.assertEqual(200, response.status_code)