diff --git a/rest_framework/fields.py b/rest_framework/fields.py index d2079d5d60..63df452ce6 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1337,18 +1337,10 @@ class ChoiceField(Field): html_cutoff_text = _('More than {count} items...') def __init__(self, choices, **kwargs): - self.grouped_choices = to_choices_dict(choices) - self.choices = flatten_choices_dict(self.grouped_choices) + self.choices = choices self.html_cutoff = kwargs.pop('html_cutoff', self.html_cutoff) self.html_cutoff_text = kwargs.pop('html_cutoff_text', self.html_cutoff_text) - # Map the string representation of choices to the underlying value. - # Allows us to deal with eg. integer choices while supporting either - # integer or string input, but still get the correct datatype out. - self.choice_strings_to_values = { - six.text_type(key): key for key in self.choices.keys() - } - self.allow_blank = kwargs.pop('allow_blank', False) super(ChoiceField, self).__init__(**kwargs) @@ -1377,6 +1369,22 @@ def iter_options(self): cutoff_text=self.html_cutoff_text ) + def _get_choices(self): + return self._choices + + def _set_choices(self, choices): + self.grouped_choices = to_choices_dict(choices) + self._choices = flatten_choices_dict(self.grouped_choices) + + # Map the string representation of choices to the underlying value. + # Allows us to deal with eg. integer choices while supporting either + # integer or string input, but still get the correct datatype out. + self.choice_strings_to_values = { + six.text_type(key): key for key in self.choices.keys() + } + + choices = property(_get_choices, _set_choices) + class MultipleChoiceField(ChoiceField): default_error_messages = { diff --git a/tests/test_fields.py b/tests/test_fields.py index 4173e6ab50..011fbe7dee 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1425,6 +1425,19 @@ def test_iter_options(self): assert items[9].value == 'boolean' + def test_edit_choices(self): + field = serializers.ChoiceField( + allow_null=True, + choices=[ + 1, 2, + ] + ) + field.choices = [1] + assert field.run_validation(1) is 1 + with pytest.raises(serializers.ValidationError) as exc_info: + field.run_validation(2) + assert exc_info.value.detail == ['"2" is not a valid choice.'] + class TestChoiceFieldWithType(FieldValues): """ pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy