mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-16 19:41:06 +03:00
More forms support
This commit is contained in:
parent
c171fa21ac
commit
ffc6aa3abc
|
@ -38,6 +38,16 @@ class RelatedField(Field):
|
||||||
queryset = queryset.all()
|
queryset = queryset.all()
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
@property
|
||||||
|
def choices(self):
|
||||||
|
return dict([
|
||||||
|
(
|
||||||
|
str(self.to_representation(item)),
|
||||||
|
str(item)
|
||||||
|
)
|
||||||
|
for item in self.queryset.all()
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
class StringRelatedField(Field):
|
class StringRelatedField(Field):
|
||||||
"""
|
"""
|
||||||
|
@ -255,3 +265,13 @@ class ManyRelation(Field):
|
||||||
self.child_relation.to_representation(value)
|
self.child_relation.to_representation(value)
|
||||||
for value in obj.all()
|
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()
|
||||||
|
])
|
||||||
|
|
|
@ -360,22 +360,43 @@ class HTMLFormRenderer(BaseRenderer):
|
||||||
serializers.MultipleChoiceField: {
|
serializers.MultipleChoiceField: {
|
||||||
'default': 'select_multiple.html',
|
'default': 'select_multiple.html',
|
||||||
'checkbox': 'select_checkbox.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):
|
def render_field(self, field, value, errors, layout=None):
|
||||||
layout = layout or 'vertical'
|
layout = layout or 'vertical'
|
||||||
style_type = field.style.get('type', 'default')
|
style_type = field.style.get('type', 'default')
|
||||||
if style_type == 'textarea' and layout == 'inline':
|
if style_type == 'textarea' and layout == 'inline':
|
||||||
style_type = 'default'
|
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]
|
base = self.field_templates[field][style_type]
|
||||||
template_name = 'rest_framework/fields/' + layout + '/' + base
|
template_name = 'rest_framework/fields/' + layout + '/' + base
|
||||||
template = loader.get_template(template_name)
|
template = loader.get_template(template_name)
|
||||||
context = Context({
|
context = Context({
|
||||||
'field': field,
|
'field': field,
|
||||||
'value': value,
|
'value': value,
|
||||||
'errors': errors
|
'errors': errors,
|
||||||
|
'input_type': input_type
|
||||||
})
|
})
|
||||||
|
|
||||||
return template.render(context)
|
return template.render(context)
|
||||||
|
|
||||||
def render(self, data, accepted_media_type=None, renderer_context=None):
|
def render(self, data, accepted_media_type=None, renderer_context=None):
|
||||||
|
@ -388,7 +409,7 @@ class HTMLFormRenderer(BaseRenderer):
|
||||||
template = loader.get_template(self.template)
|
template = loader.get_template(self.template)
|
||||||
context = RequestContext(request, {
|
context = RequestContext(request, {
|
||||||
'form': data,
|
'form': data,
|
||||||
'layout': getattr(getattr(data, 'Meta', None), 'layout', 'vertical'),
|
'layout': getattr(getattr(data, 'Meta', None), 'layout', 'horizontal'),
|
||||||
'renderer': self
|
'renderer': self
|
||||||
})
|
})
|
||||||
return template.render(context)
|
return template.render(context)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
{% include "rest_framework/fields/vertical/label.html" %}
|
{% include "rest_framework/fields/vertical/label.html" %}
|
||||||
<select multiple class="form-control" name="{{ field.field_name }}">
|
<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>
|
<option value="{{ key }}" {% if key in value %}selected{% endif %}>{{ text }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<div class="well">
|
<div class="well">
|
||||||
|
|
||||||
{% load rest_framework %}
|
{% 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 %}
|
{% csrf_token %}
|
||||||
{% for field, value, errors in form %}
|
{% for field, value, errors in form %}
|
||||||
{% render_field field value errors layout=layout renderer=renderer %}
|
{% render_field field value errors layout=layout renderer=renderer %}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user