1
0
mirror of https://github.com/django/django.git synced 2025-06-07 12:39:12 +00:00

[2.1.x] Refs #28748 -- Reallowed lazy model field choices.

Regression in 3aa9ab39cce6b2a27d6334ad0148c8f37b6f5986.

Backport of c03e41712b2274f524d32bc2aef455ed82c9e3b4 from master
This commit is contained in:
Tim Graham 2018-05-29 21:43:38 -04:00
parent 25d4d8465b
commit 4ca64f2bd5
2 changed files with 10 additions and 3 deletions

View File

@ -244,10 +244,10 @@ class Field(RegisterLookupMixin):
if not self.choices: if not self.choices:
return [] return []
def is_value(value): def is_value(value, accept_promise=True):
return isinstance(value, (str, Promise)) or not is_iterable(value) return isinstance(value, (str, Promise) if accept_promise else str) or not is_iterable(value)
if is_value(self.choices): if is_value(self.choices, accept_promise=False):
return [ return [
checks.Error( checks.Error(
"'choices' must be an iterable (e.g., a list or tuple).", "'choices' must be an iterable (e.g., a list or tuple).",

View File

@ -4,6 +4,7 @@ from django.core.checks import Error, Warning as DjangoWarning
from django.db import connection, models from django.db import connection, models
from django.test import SimpleTestCase, TestCase, skipIfDBFeature from django.test import SimpleTestCase, TestCase, skipIfDBFeature
from django.test.utils import isolate_apps, override_settings from django.test.utils import isolate_apps, override_settings
from django.utils.functional import lazy
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -188,6 +189,12 @@ class CharFieldTests(TestCase):
self.assertEqual(Model._meta.get_field('field').check(), []) self.assertEqual(Model._meta.get_field('field').check(), [])
def test_lazy_choices(self):
class Model(models.Model):
field = models.CharField(max_length=10, choices=lazy(lambda: [[1, '1'], [2, '2']], tuple)())
self.assertEqual(Model._meta.get_field('field').check(), [])
def test_choices_named_group(self): def test_choices_named_group(self):
class Model(models.Model): class Model(models.Model):
field = models.CharField( field = models.CharField(