Fixed #30902 -- Added __str__() for model choice enums.

Allows expected behavior when cast to str, also matching behaviour of
created instances with those fetched from the DB.

Thanks to Simon Charette, Nick Pope, and Shai Berger for reviews.
This commit is contained in:
Carlton Gibson 2019-10-23 16:14:06 +02:00 committed by Mariusz Felisiak
parent fc2b1cc926
commit dbcd7b064e
2 changed files with 13 additions and 1 deletions

View File

@ -60,7 +60,13 @@ class ChoicesMeta(enum.EnumMeta):
class Choices(enum.Enum, metaclass=ChoicesMeta):
"""Class for creating enumerated choices."""
pass
def __str__(self):
"""
Use value when cast to str, so that Choices set as model instance
attributes are rendered as expected in templates and similar contexts.
"""
return str(self.value)
class IntegerChoices(int, Choices):

View File

@ -143,6 +143,12 @@ class ChoicesTests(SimpleTestCase):
APPLE = 1, 'Apple'
PINEAPPLE = 1, 'Pineapple'
def test_str(self):
for test in [Gender, Suit, YearInSchool, Vehicle]:
for member in test:
with self.subTest(member=member):
self.assertEqual(str(test[member.name]), str(member.value))
class Separator(bytes, models.Choices):
FS = b'\x1c', 'File Separator'