mirror of
https://github.com/django/django.git
synced 2025-10-23 21:59:11 +00:00
Fixed #34899 -- Added blank choice to forms' callable choices lazily.
This commit is contained in:
@@ -23,6 +23,7 @@ from django.forms.models import (
|
||||
from django.template import Context, Template
|
||||
from django.test import SimpleTestCase, TestCase, ignore_warnings, skipUnlessDBFeature
|
||||
from django.test.utils import isolate_apps
|
||||
from django.utils.choices import BlankChoiceIterator
|
||||
from django.utils.deprecation import RemovedInDjango60Warning
|
||||
|
||||
from .models import (
|
||||
@@ -2012,6 +2013,38 @@ class ModelFormBasicTests(TestCase):
|
||||
),
|
||||
)
|
||||
|
||||
@isolate_apps("model_forms")
|
||||
def test_callable_choices_are_lazy(self):
|
||||
call_count = 0
|
||||
|
||||
def get_animal_choices():
|
||||
nonlocal call_count
|
||||
call_count += 1
|
||||
return [("LION", "Lion"), ("ZEBRA", "Zebra")]
|
||||
|
||||
class ZooKeeper(models.Model):
|
||||
animal = models.CharField(
|
||||
blank=True,
|
||||
choices=get_animal_choices,
|
||||
max_length=5,
|
||||
)
|
||||
|
||||
class ZooKeeperForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = ZooKeeper
|
||||
fields = ["animal"]
|
||||
|
||||
self.assertEqual(call_count, 0)
|
||||
form = ZooKeeperForm()
|
||||
self.assertEqual(call_count, 0)
|
||||
self.assertIsInstance(form.fields["animal"].choices, BlankChoiceIterator)
|
||||
self.assertEqual(call_count, 0)
|
||||
self.assertEqual(
|
||||
form.fields["animal"].choices,
|
||||
models.BLANK_CHOICE_DASH + [("LION", "Lion"), ("ZEBRA", "Zebra")],
|
||||
)
|
||||
self.assertEqual(call_count, 1)
|
||||
|
||||
def test_recleaning_model_form_instance(self):
|
||||
"""
|
||||
Re-cleaning an instance that was added via a ModelForm shouldn't raise
|
||||
|
||||
Reference in New Issue
Block a user