Only show editable fields in the browsable API raw data form on a detail view.

This commit is contained in:
Chris Church 2014-04-01 21:10:16 -04:00
parent 0b3d056c16
commit d632aa0af9
2 changed files with 17 additions and 0 deletions

View File

@ -139,6 +139,16 @@ class GenericAPIView(generics.GenericAPIView, APIView):
# model = ModelClass
# serializer_class = SerializerClass
def get_serializer(self, *args, **kwargs):
serializer = super(GenericAPIView, self).get_serializer(*args, **kwargs)
# Override when called from browsable API to generate raw data form;
# always remove read only fields from sample raw data.
if hasattr(self, '_raw_data_form_marker'):
for name, field in serializer.fields.items():
if getattr(field, 'read_only', None):
del serializer.fields[name]
return serializer
def get_queryset(self):
#if hasattr(self.request.user, 'get_queryset'):
# return self.request.user.get_queryset(self.model)

View File

@ -16,6 +16,13 @@ class BrowsableAPIRenderer(renderers.BrowsableAPIRenderer):
return renderers.JSONRenderer()
return renderer
def get_raw_data_form(self, view, method, request):
try:
setattr(view, '_raw_data_form_marker', True)
return super(BrowsableAPIRenderer, self).get_raw_data_form(view, method, request)
finally:
delattr(view, '_raw_data_form_marker')
def get_rendered_html_form(self, view, method, request):
'''Never show auto-generated form (only raw form).'''
obj = getattr(view, 'object', None)