diff options
| -rw-r--r-- | rest_framework/relations.py | 20 | ||||
| -rw-r--r-- | rest_framework/renderers.py | 25 | ||||
| -rw-r--r-- | rest_framework/templates/rest_framework/fields/vertical/select_multiple.html | 2 | ||||
| -rw-r--r-- | rest_framework/templates/rest_framework/form.html | 2 | 
4 files changed, 45 insertions, 4 deletions
| diff --git a/rest_framework/relations.py b/rest_framework/relations.py index b5effc6c..8c135672 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 6483a47c..297c60d8 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 f0fa418b..00b25b4b 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 @@  <div class="form-group">      {% include "rest_framework/fields/vertical/label.html" %}      <select multiple class="form-control" name="{{ field.field_name }}"> -        {% for key, text in field.choices.items() %} +        {% for key, text in field.choices.items %}          <option value="{{ key }}" {% if key in value %}selected{% endif %}>{{ text }}</option>          {% endfor %}      </select> diff --git a/rest_framework/templates/rest_framework/form.html b/rest_framework/templates/rest_framework/form.html index 64b1b0bc..658aa293 100644 --- a/rest_framework/templates/rest_framework/form.html +++ b/rest_framework/templates/rest_framework/form.html @@ -9,7 +9,7 @@  <div class="well">  {% load rest_framework %} -<form {% if layout == "inline" %}class="form-inline"{% elif layout == "horizontal" %}class="form-horizontal"{% endif %} role="form" action="" method="POST"> +<form {% if layout == "inline" %}class="form-inline"{% elif layout == "horizontal" %}class="form-horizontal"{% endif %} role="form" action="." method="POST">      {% csrf_token %}      {% for field, value, errors in form %}          {% render_field field value errors layout=layout renderer=renderer %} | 
