Refs #28748 -- Reallowed lazy model field choices.

Regression in 3aa9ab39cc.
This commit is contained in:
Tim Graham 2018-05-29 21:43:38 -04:00 committed by GitHub
parent 3dffcb5579
commit c03e41712b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 3 deletions

View File

@ -244,10 +244,10 @@ class Field(RegisterLookupMixin):
if not self.choices:
return []
def is_value(value):
return isinstance(value, (str, Promise)) or not is_iterable(value)
def is_value(value, accept_promise=True):
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 [
checks.Error(
"'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.test import SimpleTestCase, TestCase, skipIfDBFeature
from django.test.utils import isolate_apps, override_settings
from django.utils.functional import lazy
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
@ -188,6 +189,12 @@ class CharFieldTests(TestCase):
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):
class Model(models.Model):
field = models.CharField(