mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-10-31 16:07:38 +03:00 
			
		
		
		
	Merge branch 'custom-serializer-form-class' of https://github.com/ludwigkraatz/django-rest-framework into mergebranch#390
Conflicts: rest_framework/fields.py rest_framework/renderers.py Manually solved
This commit is contained in:
		
						commit
						968f4a5ca4
					
				|  | @ -10,6 +10,7 @@ from django.core import validators | |||
| from django.core.exceptions import ObjectDoesNotExist, ValidationError | ||||
| from django.core.urlresolvers import resolve, get_script_prefix | ||||
| from django.conf import settings | ||||
| from django import forms | ||||
| from django.forms import widgets | ||||
| from django.forms.models import ModelChoiceIterator | ||||
| from django.utils.encoding import is_protected_type, smart_unicode | ||||
|  | @ -35,6 +36,7 @@ class Field(object): | |||
|     empty = '' | ||||
|     type_name = None | ||||
|     _use_files = None | ||||
|     form_field_class = forms.CharField | ||||
| 
 | ||||
|     def __init__(self, source=None): | ||||
|         self.parent = None | ||||
|  | @ -55,7 +57,7 @@ class Field(object): | |||
|         self.root = parent.root or parent | ||||
|         self.context = self.root.context | ||||
|         if self.root.partial: | ||||
|             self.required = False  | ||||
|             self.required = False | ||||
| 
 | ||||
|     def field_from_native(self, data, files, field_name, into): | ||||
|         """ | ||||
|  | @ -223,7 +225,7 @@ class ModelField(WritableField): | |||
|                             getattr(self.model_field, 'min_length', None)) | ||||
|         self.max_length = kwargs.pop('max_length', | ||||
|                             getattr(self.model_field, 'max_length', None)) | ||||
|          | ||||
| 
 | ||||
|         super(ModelField, self).__init__(*args, **kwargs) | ||||
| 
 | ||||
|         if self.min_length is not None: | ||||
|  | @ -394,6 +396,7 @@ class PrimaryKeyRelatedField(RelatedField): | |||
|     Represents a to-one relationship as a pk value. | ||||
|     """ | ||||
|     default_read_only = False | ||||
|     form_field_class = forms.ChoiceField | ||||
| 
 | ||||
|     # TODO: Remove these field hacks... | ||||
|     def prepare_value(self, obj): | ||||
|  | @ -440,6 +443,7 @@ class ManyPrimaryKeyRelatedField(ManyRelatedField): | |||
|     Represents a to-many relationship as a pk value. | ||||
|     """ | ||||
|     default_read_only = False | ||||
|     form_field_class = forms.MultipleChoiceField | ||||
| 
 | ||||
|     def prepare_value(self, obj): | ||||
|         return self.to_native(obj.pk) | ||||
|  | @ -483,6 +487,7 @@ class ManyPrimaryKeyRelatedField(ManyRelatedField): | |||
| 
 | ||||
| class SlugRelatedField(RelatedField): | ||||
|     default_read_only = False | ||||
|     form_field_class = forms.ChoiceField | ||||
| 
 | ||||
|     def __init__(self, *args, **kwargs): | ||||
|         self.slug_field = kwargs.pop('slug_field', None) | ||||
|  | @ -504,7 +509,7 @@ class SlugRelatedField(RelatedField): | |||
| 
 | ||||
| 
 | ||||
| class ManySlugRelatedField(ManyRelatedMixin, SlugRelatedField): | ||||
|     pass | ||||
|     form_field_class = forms.MultipleChoiceField | ||||
| 
 | ||||
| 
 | ||||
| ### Hyperlinked relationships | ||||
|  | @ -517,6 +522,7 @@ class HyperlinkedRelatedField(RelatedField): | |||
|     slug_field = 'slug' | ||||
|     slug_url_kwarg = None  # Defaults to same as `slug_field` unless overridden | ||||
|     default_read_only = False | ||||
|     form_field_class = forms.ChoiceField | ||||
| 
 | ||||
|     def __init__(self, *args, **kwargs): | ||||
|         try: | ||||
|  | @ -616,7 +622,7 @@ class ManyHyperlinkedRelatedField(ManyRelatedMixin, HyperlinkedRelatedField): | |||
|     """ | ||||
|     Represents a to-many relationship, using hyperlinking. | ||||
|     """ | ||||
|     pass | ||||
|     form_field_class = forms.MultipleChoiceField | ||||
| 
 | ||||
| 
 | ||||
| class HyperlinkedIdentityField(Field): | ||||
|  | @ -674,6 +680,7 @@ class HyperlinkedIdentityField(Field): | |||
| 
 | ||||
| class BooleanField(WritableField): | ||||
|     type_name = 'BooleanField' | ||||
|     form_field_class = forms.BooleanField | ||||
|     widget = widgets.CheckboxInput | ||||
|     default_error_messages = { | ||||
|         'invalid': _(u"'%s' value must be either True or False."), | ||||
|  | @ -695,6 +702,7 @@ class BooleanField(WritableField): | |||
| 
 | ||||
| class CharField(WritableField): | ||||
|     type_name = 'CharField' | ||||
|     form_field_class = forms.CharField | ||||
| 
 | ||||
|     def __init__(self, max_length=None, min_length=None, *args, **kwargs): | ||||
|         self.max_length, self.min_length = max_length, min_length | ||||
|  | @ -739,6 +747,7 @@ class SlugField(CharField): | |||
| 
 | ||||
| class ChoiceField(WritableField): | ||||
|     type_name = 'ChoiceField' | ||||
|     form_field_class = forms.ChoiceField | ||||
|     widget = widgets.Select | ||||
|     default_error_messages = { | ||||
|         'invalid_choice': _('Select a valid choice. %(value)s is not one of the available choices.'), | ||||
|  | @ -785,6 +794,7 @@ class ChoiceField(WritableField): | |||
| 
 | ||||
| class EmailField(CharField): | ||||
|     type_name = 'EmailField' | ||||
|     form_field_class = forms.EmailField | ||||
| 
 | ||||
|     default_error_messages = { | ||||
|         'invalid': _('Enter a valid e-mail address.'), | ||||
|  | @ -836,6 +846,7 @@ class RegexField(CharField): | |||
| class DateField(WritableField): | ||||
|     type_name = 'DateField' | ||||
|     widget = widgets.DateInput | ||||
|     form_field_class = forms.DateField | ||||
| 
 | ||||
|     default_error_messages = { | ||||
|         'invalid': _(u"'%s' value has an invalid date format. It must be " | ||||
|  | @ -874,6 +885,7 @@ class DateField(WritableField): | |||
| class DateTimeField(WritableField): | ||||
|     type_name = 'DateTimeField' | ||||
|     widget = widgets.DateTimeInput | ||||
|     form_field_class = forms.DateTimeField | ||||
| 
 | ||||
|     default_error_messages = { | ||||
|         'invalid': _(u"'%s' value has an invalid format. It must be in " | ||||
|  | @ -928,6 +940,7 @@ class DateTimeField(WritableField): | |||
| 
 | ||||
| class IntegerField(WritableField): | ||||
|     type_name = 'IntegerField' | ||||
|     form_field_class = forms.IntegerField | ||||
| 
 | ||||
|     default_error_messages = { | ||||
|         'invalid': _('Enter a whole number.'), | ||||
|  | @ -957,6 +970,7 @@ class IntegerField(WritableField): | |||
| 
 | ||||
| class FloatField(WritableField): | ||||
|     type_name = 'FloatField' | ||||
|     form_field_class = forms.FloatField | ||||
| 
 | ||||
|     default_error_messages = { | ||||
|         'invalid': _("'%s' value must be a float."), | ||||
|  | @ -976,6 +990,7 @@ class FloatField(WritableField): | |||
| class FileField(WritableField): | ||||
|     _use_files = True | ||||
|     type_name = 'FileField' | ||||
|     form_field_class = forms.FileField | ||||
|     widget = widgets.FileInput | ||||
| 
 | ||||
|     default_error_messages = { | ||||
|  | @ -1018,6 +1033,7 @@ class FileField(WritableField): | |||
| 
 | ||||
| class ImageField(FileField): | ||||
|     _use_files = True | ||||
|     form_field_class = forms.ImageField | ||||
| 
 | ||||
|     default_error_messages = { | ||||
|         'invalid_image': _("Upload a valid image. The file you uploaded was either not an image or a corrupted image."), | ||||
|  |  | |||
|  | @ -306,26 +306,6 @@ class BrowsableAPIRenderer(BaseRenderer): | |||
|         return True | ||||
| 
 | ||||
|     def serializer_to_form_fields(self, serializer): | ||||
|         field_mapping = { | ||||
|             serializers.FloatField: forms.FloatField, | ||||
|             serializers.IntegerField: forms.IntegerField, | ||||
|             serializers.DateTimeField: forms.DateTimeField, | ||||
|             serializers.DateField: forms.DateField, | ||||
|             serializers.EmailField: forms.EmailField, | ||||
|             serializers.RegexField: forms.RegexField, | ||||
|             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, | ||||
|             serializers.FileField: forms.FileField, | ||||
|             serializers.ImageField: forms.ImageField, | ||||
|         } | ||||
| 
 | ||||
|         fields = {} | ||||
|         for k, v in serializer.get_fields().items(): | ||||
|             if getattr(v, 'read_only', True): | ||||
|  | @ -349,13 +329,7 @@ class BrowsableAPIRenderer(BaseRenderer): | |||
| 
 | ||||
|             kwargs['label'] = k | ||||
| 
 | ||||
|             try: | ||||
|                 fields[k] = 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) | ||||
|             fields[k] = v.form_field_class(**kwargs) | ||||
|         return fields | ||||
| 
 | ||||
|     def get_form(self, view, method, request): | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user