aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rest_framework/fields.py14
-rw-r--r--rest_framework/serializers.py6
-rw-r--r--rest_framework/tests/models.py3
-rw-r--r--rest_framework/tests/serializer.py30
4 files changed, 47 insertions, 6 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index dd90c3f8..ca421ace 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -39,7 +39,7 @@ class Field(object):
_use_files = None
form_field_class = forms.CharField
- def __init__(self, source=None):
+ def __init__(self, source=None, label=None, help_text=None):
self.parent = None
self.creation_counter = Field.creation_counter
@@ -47,6 +47,12 @@ class Field(object):
self.source = source
+ if label is not None:
+ self.label = smart_unicode(label)
+
+ if help_text is not None:
+ self.help_text = smart_unicode(help_text)
+
def initialize(self, parent, field_name):
"""
Called to set up a field prior to field_to_native or field_from_native.
@@ -124,11 +130,11 @@ class WritableField(Field):
widget = widgets.TextInput
default = None
- def __init__(self, source=None, read_only=False, required=None,
+ def __init__(self, source=None, label=None, help_text=None,
+ read_only=False, required=None,
validators=[], error_messages=None, widget=None,
default=None, blank=None):
-
- super(WritableField, self).__init__(source=source)
+ super(WritableField, self).__init__(source=source, label=label, help_text=help_text)
self.read_only = read_only
if required is None:
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 8156bc18..e9bc25e4 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -453,6 +453,12 @@ class ModelSerializer(Serializer):
kwargs['choices'] = model_field.flatchoices
return ChoiceField(**kwargs)
+ if model_field.verbose_name is not None:
+ kwargs['label'] = model_field.verbose_name
+
+ if model_field.help_text is not None:
+ kwargs['help_text'] = model_field.help_text
+
field_mapping = {
models.FloatField: FloatField,
models.IntegerField: IntegerField,
diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py
index 0759650a..69fd0b30 100644
--- a/rest_framework/tests/models.py
+++ b/rest_framework/tests/models.py
@@ -1,6 +1,7 @@
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.generic import GenericForeignKey, GenericRelation
+from django.utils.translation import ugettext_lazy as _
# from django.contrib.auth.models import Group
@@ -61,7 +62,7 @@ class Anchor(RESTFrameworkModel):
class BasicModel(RESTFrameworkModel):
- text = models.CharField(max_length=100)
+ text = models.CharField(max_length=100, verbose_name=_("Text"), help_text=_("Text description."))
class SlugBasedModel(RESTFrameworkModel):
diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py
index f780e811..1c7283ae 100644
--- a/rest_framework/tests/serializer.py
+++ b/rest_framework/tests/serializer.py
@@ -1,7 +1,7 @@
import datetime
import pickle
from django.test import TestCase
-from rest_framework import serializers
+from rest_framework import serializers, fields
from rest_framework.tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel,
BlankFieldModel, BlogPost, Book, CallableDefaultValueModel, DefaultValueModel,
ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo)
@@ -863,3 +863,31 @@ class NestedSerializerContextTests(TestCase):
# This will raise RuntimeError if context doesn't get passed correctly to the nested Serializers
AlbumCollectionSerializer(album_collection, context={'context_item': 'album context'}).data
+
+
+# Test for issue #467
+class FieldLabelTest(TestCase):
+ def setUp(self):
+ class LabelModelSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = BasicModel
+
+ self.serializer_class = LabelModelSerializer
+
+ def test_label_from_model(self):
+ """
+ Validates that label and help_text are correctly copied from the model class.
+ """
+ serializer = self.serializer_class()
+ text_field = serializer.fields['text']
+
+ self.assertEquals(u'Text', text_field.label)
+ self.assertEquals(u'Text description.', text_field.help_text)
+
+ def test_field_ctor(self):
+ """
+ This is check that ctor supports both label and help_text.
+ """
+ self.assertEquals(u'Label', fields.Field(label='Label', help_text='Help').label)
+ self.assertEquals(u'Help', fields.CharField(label='Label', help_text='Help').help_text)
+ self.assertEquals(u'Label', fields.ManyHyperlinkedRelatedField(view_name='fake', label='Label', help_text='Help').label)