diff options
| author | Tom Christie | 2012-10-03 09:45:27 +0100 |
|---|---|---|
| committer | Tom Christie | 2012-10-03 09:45:27 +0100 |
| commit | 1a05942166abfc68f83caea535aa44733b1e37a9 (patch) | |
| tree | 02ce6b0d2dfa4a1bf60368be0a0f236860eceeaa | |
| parent | c30e0795bebd9980a66ae7db1a0d8c43f77d4c11 (diff) | |
| download | django-rest-framework-1a05942166abfc68f83caea535aa44733b1e37a9.tar.bz2 | |
Stopgap fix for model fields rendering in browseable API
| -rw-r--r-- | rest_framework/renderers.py | 26 | ||||
| -rw-r--r-- | rest_framework/serializers.py | 20 |
2 files changed, 25 insertions, 21 deletions
diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index b3d27630..9484e29b 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -238,15 +238,16 @@ class DocumentingHTMLRenderer(BaseRenderer): return self.get_generic_content_form(view) # We need to map our Fields to Django's Fields. - field_mapping = dict([ - [serializers.FloatField.__name__, forms.FloatField], - [serializers.IntegerField.__name__, forms.IntegerField], - [serializers.DateTimeField.__name__, forms.DateTimeField], - [serializers.DateField.__name__, forms.DateField], - [serializers.EmailField.__name__, forms.EmailField], - [serializers.CharField.__name__, forms.CharField], - [serializers.BooleanField.__name__, forms.BooleanField] - ]) + # TODO: Remove this and just render serializer fields directly + field_mapping = { + serializers.FloatField: forms.FloatField, + serializers.IntegerField: forms.IntegerField, + serializers.DateTimeField: forms.DateTimeField, + serializers.DateField: forms.DateField, + serializers.EmailField: forms.EmailField, + serializers.CharField: forms.CharField, + serializers.BooleanField: forms.BooleanField + } # Creating an on the fly form see: http://stackoverflow.com/questions/3915024/dynamically-creating-classes-python fields = {} @@ -255,10 +256,13 @@ class DocumentingHTMLRenderer(BaseRenderer): obj = view.object serializer = view.get_serializer(instance=obj) - for k, v in serializer.fields.items(): + for k, v in serializer.get_fields(True).items(): if v.readonly: continue - fields[k] = field_mapping[v.__class__.__name__]() + try: + fields[k] = field_mapping[v.__class__]() + except KeyError: + fields[k] = forms.CharField OnTheFlyForm = type("OnTheFlyForm", (forms.Form,), fields) if obj and not view.request.method == 'DELETE': # Don't fill in the form when the object is deleted diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 83ec1470..5935bce5 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -350,16 +350,16 @@ class ModelSerializer(RelatedField, Serializer): """ Creates a default instance of a basic non-relational field. """ - field_mapping = dict([ - [models.FloatField, FloatField], - [models.IntegerField, IntegerField], - [models.DateTimeField, DateTimeField], - [models.DateField, DateField], - [models.EmailField, EmailField], - [models.CharField, CharField], - [models.CommaSeparatedIntegerField, CharField], - [models.BooleanField, BooleanField] - ]) + field_mapping = { + models.FloatField: FloatField, + models.IntegerField: IntegerField, + models.DateTimeField: DateTimeField, + models.DateField: DateField, + models.EmailField: EmailField, + models.CharField: CharField, + models.CommaSeparatedIntegerField: CharField, + models.BooleanField: BooleanField + } try: return field_mapping[model_field.__class__]() except KeyError: |
