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: 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(