mirror of https://github.com/django/django.git
[3.0.x] 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.
Backport of 5166097d7c
from master
This commit is contained in:
parent
2efc832cdf
commit
16297e7d5e
|
@ -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):
|
||||
|
|
|
@ -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`).
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue