diff --git a/docs/api-guide/fields.md b/docs/api-guide/fields.md index 5acaf123ec..0409f9a6c6 100644 --- a/docs/api-guide/fields.md +++ b/docs/api-guide/fields.md @@ -81,7 +81,13 @@ A text string that may be used as a description of the field in HTML form fields ### `initial` -A value that should be used for pre-populating the value of HTML form fields. +A value that should be used for pre-populating the value of HTML form fields. You may pass a callable to it, just as +you may do with any regular Django `Field`: + + import datetime + from rest_framework import serializers + class ExampleSerializer(serializers.Serializer): + day = serializers.DateField(initial=datetime.date.today) ### `style` diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 6d5962c8ec..917e412cc4 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -370,6 +370,8 @@ def get_initial(self): Return a value to use when the field is being returned as a primitive value, without any object instance. """ + if callable(self.initial): + return self.initial() return self.initial def get_value(self, dictionary): diff --git a/tests/test_fields.py b/tests/test_fields.py index 43441c2e7c..0a878ca790 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -191,6 +191,24 @@ def test_initial(self): } +class TestInitialWithCallable: + def setup(self): + def initial_value(): + return 123 + + class TestSerializer(serializers.Serializer): + initial_field = serializers.IntegerField(initial=initial_value) + self.serializer = TestSerializer() + + def test_initial_should_accept_callable(self): + """ + Follows the default ``Field.initial`` behaviour where they accept a + callable to produce the initial value""" + assert self.serializer.data == { + 'initial_field': 123, + } + + class TestLabel: def setup(self): class TestSerializer(serializers.Serializer):