diff options
| author | Adam Johnson <me@adamj.eu> | 2020-01-09 15:41:54 +0000 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-01-10 07:52:06 +0100 |
| commit | 5166097d7c80cab757e44f2d02f3d148fbbc2ff6 (patch) | |
| tree | 212330fa1fee4064945231b9523eb8cfa64a4b41 | |
| parent | 4c1b401e8250f9f520b3c7dc369554477ce8b15a (diff) | |
Fixed #31154 -- Added support for using enumeration types in templates.
Enumeration helpers are callables, so the template system tried to call
them with no arguments.
Thanks Rupert Baker for helping discover this.
| -rw-r--r-- | django/db/models/enums.py | 1 | ||||
| -rw-r--r-- | docs/releases/3.0.3.txt | 3 | ||||
| -rw-r--r-- | tests/model_enums/tests.py | 6 |
3 files changed, 10 insertions, 0 deletions
diff --git a/django/db/models/enums.py b/django/db/models/enums.py index f48143ddaf..51821a2b45 100644 --- a/django/db/models/enums.py +++ b/django/db/models/enums.py @@ -31,6 +31,7 @@ class ChoicesMeta(enum.EnumMeta): # that is passed in as "self" as the value to use when looking up the # label in the choices. cls.label = property(lambda self: cls._value2label_map_.get(self.value)) + cls.do_not_call_in_templates = True return enum.unique(cls) def __contains__(cls, member): diff --git a/docs/releases/3.0.3.txt b/docs/releases/3.0.3.txt index 27ace475d1..ab5a2fd84b 100644 --- a/docs/releases/3.0.3.txt +++ b/docs/releases/3.0.3.txt @@ -20,3 +20,6 @@ Bugfixes * Relaxed the system check added in Django 3.0 to reallow use of a sublanguage in the :setting:`LANGUAGE_CODE` setting, when a base language is available in Django but the sublanguage is not (:ticket:`31141`). + +* Added support for using enumeration types ``TextChoices``, + ``IntegerChoices``, and ``Choices`` in templates (:ticket:`31154`). diff --git a/tests/model_enums/tests.py b/tests/model_enums/tests.py index b9356479de..ffc199ce42 100644 --- a/tests/model_enums/tests.py +++ b/tests/model_enums/tests.py @@ -4,6 +4,7 @@ import ipaddress import uuid from django.db import models +from django.template import Context, Template from django.test import SimpleTestCase from django.utils.functional import Promise from django.utils.translation import gettext_lazy as _ @@ -149,6 +150,11 @@ class ChoicesTests(SimpleTestCase): with self.subTest(member=member): self.assertEqual(str(test[member.name]), str(member.value)) + def test_templates(self): + template = Template('{{ Suit.DIAMOND.label }}|{{ Suit.DIAMOND.value }}') + output = template.render(Context({'Suit': Suit})) + self.assertEqual(output, 'Diamond|1') + class Separator(bytes, models.Choices): FS = b'\x1c', 'File Separator' |
