Fields specify what FormFieldClass should be used by BrowsableApiRenderer

added SerializerField Attribute "form_field_class" and defaults for
existing Fields
This commit is contained in:
Ludwig Kraatz 2012-11-08 16:02:03 +01:00
parent 607cf82331
commit 5cd64cc551
2 changed files with 17 additions and 25 deletions

View File

@ -7,6 +7,7 @@ from django.core import validators
from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.urlresolvers import resolve, get_script_prefix from django.core.urlresolvers import resolve, get_script_prefix
from django.conf import settings from django.conf import settings
from django import forms
from django.forms import widgets from django.forms import widgets
from django.forms.models import ModelChoiceIterator from django.forms.models import ModelChoiceIterator
from django.utils.encoding import is_protected_type, smart_unicode from django.utils.encoding import is_protected_type, smart_unicode
@ -31,6 +32,7 @@ class Field(object):
creation_counter = 0 creation_counter = 0
empty = '' empty = ''
type_name = None type_name = None
form_field_class = forms.CharField
def __init__(self, source=None): def __init__(self, source=None):
self.parent = None self.parent = None
@ -374,6 +376,7 @@ class PrimaryKeyRelatedField(RelatedField):
Represents a to-one relationship as a pk value. Represents a to-one relationship as a pk value.
""" """
default_read_only = False default_read_only = False
form_field_class = forms.ChoiceField
# TODO: Remove these field hacks... # TODO: Remove these field hacks...
def prepare_value(self, obj): def prepare_value(self, obj):
@ -420,6 +423,7 @@ class ManyPrimaryKeyRelatedField(ManyRelatedField):
Represents a to-many relationship as a pk value. Represents a to-many relationship as a pk value.
""" """
default_read_only = False default_read_only = False
form_field_class = forms.MultipleChoiceField
def prepare_value(self, obj): def prepare_value(self, obj):
return self.to_native(obj.pk) return self.to_native(obj.pk)
@ -463,6 +467,7 @@ class ManyPrimaryKeyRelatedField(ManyRelatedField):
class SlugRelatedField(RelatedField): class SlugRelatedField(RelatedField):
default_read_only = False default_read_only = False
form_field_class = forms.ChoiceField
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.slug_field = kwargs.pop('slug_field', None) self.slug_field = kwargs.pop('slug_field', None)
@ -484,7 +489,7 @@ class SlugRelatedField(RelatedField):
class ManySlugRelatedField(ManyRelatedMixin, SlugRelatedField): class ManySlugRelatedField(ManyRelatedMixin, SlugRelatedField):
pass form_field_class = forms.MultipleChoiceField
### Hyperlinked relationships ### Hyperlinked relationships
@ -497,6 +502,7 @@ class HyperlinkedRelatedField(RelatedField):
slug_field = 'slug' slug_field = 'slug'
slug_url_kwarg = None # Defaults to same as `slug_field` unless overridden slug_url_kwarg = None # Defaults to same as `slug_field` unless overridden
default_read_only = False default_read_only = False
form_field_class = forms.ChoiceField
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
try: try:
@ -593,7 +599,7 @@ class ManyHyperlinkedRelatedField(ManyRelatedMixin, HyperlinkedRelatedField):
""" """
Represents a to-many relationship, using hyperlinking. Represents a to-many relationship, using hyperlinking.
""" """
pass form_field_class = forms.MultipleChoiceField
class HyperlinkedIdentityField(Field): class HyperlinkedIdentityField(Field):
@ -651,6 +657,7 @@ class HyperlinkedIdentityField(Field):
class BooleanField(WritableField): class BooleanField(WritableField):
type_name = 'BooleanField' type_name = 'BooleanField'
form_field_class = forms.BooleanField
widget = widgets.CheckboxInput widget = widgets.CheckboxInput
default_error_messages = { default_error_messages = {
'invalid': _(u"'%s' value must be either True or False."), 'invalid': _(u"'%s' value must be either True or False."),
@ -672,6 +679,7 @@ class BooleanField(WritableField):
class CharField(WritableField): class CharField(WritableField):
type_name = 'CharField' type_name = 'CharField'
form_field_class = forms.CharField
def __init__(self, max_length=None, min_length=None, *args, **kwargs): def __init__(self, max_length=None, min_length=None, *args, **kwargs):
self.max_length, self.min_length = max_length, min_length self.max_length, self.min_length = max_length, min_length
@ -699,6 +707,7 @@ class CharField(WritableField):
class ChoiceField(WritableField): class ChoiceField(WritableField):
type_name = 'ChoiceField' type_name = 'ChoiceField'
form_field_class = forms.ChoiceField
widget = widgets.Select widget = widgets.Select
default_error_messages = { default_error_messages = {
'invalid_choice': _('Select a valid choice. %(value)s is not one of the available choices.'), 'invalid_choice': _('Select a valid choice. %(value)s is not one of the available choices.'),
@ -745,6 +754,7 @@ class ChoiceField(WritableField):
class EmailField(CharField): class EmailField(CharField):
type_name = 'EmailField' type_name = 'EmailField'
form_field_class = forms.EmailField
default_error_messages = { default_error_messages = {
'invalid': _('Enter a valid e-mail address.'), 'invalid': _('Enter a valid e-mail address.'),
@ -767,6 +777,7 @@ class EmailField(CharField):
class DateField(WritableField): class DateField(WritableField):
type_name = 'DateField' type_name = 'DateField'
form_field_class = forms.DateField
default_error_messages = { default_error_messages = {
'invalid': _(u"'%s' value has an invalid date format. It must be " 'invalid': _(u"'%s' value has an invalid date format. It must be "
@ -804,6 +815,7 @@ class DateField(WritableField):
class DateTimeField(WritableField): class DateTimeField(WritableField):
type_name = 'DateTimeField' type_name = 'DateTimeField'
form_field_class = forms.DateTimeField
default_error_messages = { default_error_messages = {
'invalid': _(u"'%s' value has an invalid format. It must be in " 'invalid': _(u"'%s' value has an invalid format. It must be in "
@ -858,6 +870,7 @@ class DateTimeField(WritableField):
class IntegerField(WritableField): class IntegerField(WritableField):
type_name = 'IntegerField' type_name = 'IntegerField'
form_field_class = forms.IntegerField
default_error_messages = { default_error_messages = {
'invalid': _('Enter a whole number.'), 'invalid': _('Enter a whole number.'),
@ -887,6 +900,7 @@ class IntegerField(WritableField):
class FloatField(WritableField): class FloatField(WritableField):
type_name = 'FloatField' type_name = 'FloatField'
form_field_class = forms.FloatField
default_error_messages = { default_error_messages = {
'invalid': _("'%s' value must be a float."), 'invalid': _("'%s' value must be a float."),

View File

@ -258,22 +258,6 @@ class BrowsableAPIRenderer(BaseRenderer):
media_type = 'text/html' media_type = 'text/html'
format = 'api' format = 'api'
template = 'rest_framework/api.html' template = 'rest_framework/api.html'
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.ChoiceField: forms.ChoiceField,
serializers.BooleanField: forms.BooleanField,
serializers.PrimaryKeyRelatedField: forms.ChoiceField,
serializers.ManyPrimaryKeyRelatedField: forms.MultipleChoiceField,
serializers.SlugRelatedField: forms.ChoiceField,
serializers.ManySlugRelatedField: forms.MultipleChoiceField,
serializers.HyperlinkedRelatedField: forms.ChoiceField,
serializers.ManyHyperlinkedRelatedField: forms.MultipleChoiceField
}
def get_default_renderer(self, view): def get_default_renderer(self, view):
""" """
@ -346,13 +330,7 @@ class BrowsableAPIRenderer(BaseRenderer):
kwargs['label'] = k kwargs['label'] = k
try: fields[k] = v.form_field_class(**kwargs)
fields[k] = self.field_mapping[v.__class__](**kwargs)
except KeyError:
if getattr(v, 'choices', None) is not None:
fields[k] = forms.ChoiceField(**kwargs)
else:
fields[k] = forms.CharField(**kwargs)
return fields return fields
def get_form(self, view, method, request): def get_form(self, view, method, request):