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):
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: