From 432e693ed5677f7014739a58bc9111cf074a6092 Mon Sep 17 00:00:00 2001 From: Craig de Stigter Date: Thu, 1 Mar 2018 13:29:36 +1300 Subject: [PATCH] Don't show hidden fields in metadata HiddenField is meant to be hidden, but we discovered it showing up in OPTIONS requests --- rest_framework/metadata.py | 1 + tests/test_metadata.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/rest_framework/metadata.py b/rest_framework/metadata.py index 410acd0e2..6bb2ff5e7 100644 --- a/rest_framework/metadata.py +++ b/rest_framework/metadata.py @@ -110,6 +110,7 @@ class SimpleMetadata(BaseMetadata): return OrderedDict([ (field_name, self.get_field_info(field)) for field_name, field in serializer.fields.items() + if not isinstance(field, serializers.HiddenField) ]) def get_field_info(self, field): diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 647a30dbd..7fc5afbcc 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -268,6 +268,27 @@ class TestMetadata: view = ExampleView.as_view(versioning_class=scheme) view(request=request) + def test_dont_show_hidden_fields(self): + """ + HiddenField shouldn't show up in SimpleMetadata at all. + """ + class ExampleSerializer(serializers.Serializer): + integer_field = serializers.IntegerField(max_value=10) + hidden_field = serializers.HiddenField(default=1) + + class ExampleView(views.APIView): + """Example view.""" + def post(self, request): + pass + + def get_serializer(self): + return ExampleSerializer() + + view = ExampleView.as_view() + response = view(request=request) + assert response.status_code == status.HTTP_200_OK + assert set(response.data['actions']['POST'].keys()) == {'integer_field'} + def test_list_serializer_metadata_returns_info_about_fields_of_child_serializer(self): class ExampleSerializer(serializers.Serializer): integer_field = serializers.IntegerField(max_value=10)