diff --git a/rest_framework/relations.py b/rest_framework/relations.py index b5effc6cb..8c1356727 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -38,6 +38,16 @@ class RelatedField(Field): queryset = queryset.all() return queryset + @property + def choices(self): + return dict([ + ( + str(self.to_representation(item)), + str(item) + ) + for item in self.queryset.all() + ]) + class StringRelatedField(Field): """ @@ -255,3 +265,13 @@ class ManyRelation(Field): self.child_relation.to_representation(value) for value in obj.all() ] + + @property + def choices(self): + return dict([ + ( + str(self.child_relation.to_representation(item)), + str(item) + ) + for item in self.child_relation.queryset.all() + ]) diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 6483a47c0..297c60d8f 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -360,22 +360,43 @@ class HTMLFormRenderer(BaseRenderer): serializers.MultipleChoiceField: { 'default': 'select_multiple.html', 'checkbox': 'select_checkbox.html' + }, + serializers.ManyRelation: { + 'default': 'select_multiple.html', + 'checkbox': 'select_checkbox.html' } }) + input_type = ClassLookupDict({ + serializers.Field: 'text', + serializers.EmailField: 'email', + serializers.URLField: 'url', + serializers.IntegerField: 'number', + serializers.DateTimeField: 'datetime-local', + serializers.DateField: 'date', + serializers.TimeField: 'time', + }) + def render_field(self, field, value, errors, layout=None): layout = layout or 'vertical' style_type = field.style.get('type', 'default') if style_type == 'textarea' and layout == 'inline': style_type = 'default' + + input_type = self.input_type[field] + if input_type == 'datetime-local': + value = value.rstrip('Z') + base = self.field_templates[field][style_type] template_name = 'rest_framework/fields/' + layout + '/' + base template = loader.get_template(template_name) context = Context({ 'field': field, 'value': value, - 'errors': errors + 'errors': errors, + 'input_type': input_type }) + return template.render(context) def render(self, data, accepted_media_type=None, renderer_context=None): @@ -388,7 +409,7 @@ class HTMLFormRenderer(BaseRenderer): template = loader.get_template(self.template) context = RequestContext(request, { 'form': data, - 'layout': getattr(getattr(data, 'Meta', None), 'layout', 'vertical'), + 'layout': getattr(getattr(data, 'Meta', None), 'layout', 'horizontal'), 'renderer': self }) return template.render(context) diff --git a/rest_framework/templates/rest_framework/fields/vertical/select_multiple.html b/rest_framework/templates/rest_framework/fields/vertical/select_multiple.html index f0fa418b5..00b25b4b1 100644 --- a/rest_framework/templates/rest_framework/fields/vertical/select_multiple.html +++ b/rest_framework/templates/rest_framework/fields/vertical/select_multiple.html @@ -1,7 +1,7 @@
{% include "rest_framework/fields/vertical/label.html" %} diff --git a/rest_framework/templates/rest_framework/form.html b/rest_framework/templates/rest_framework/form.html index 64b1b0bc5..658aa2934 100644 --- a/rest_framework/templates/rest_framework/form.html +++ b/rest_framework/templates/rest_framework/form.html @@ -9,7 +9,7 @@
{% load rest_framework %} -
+ {% csrf_token %} {% for field, value, errors in form %} {% render_field field value errors layout=layout renderer=renderer %}