1
0
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:
Nick Pope
2023-10-16 19:11:18 +01:00
committed by Natalia
parent 74afcee234
commit 171f91d9ef
3 changed files with 52 additions and 8 deletions

View File

@@ -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