diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 217f37b022..ec076398cc 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -693,8 +693,11 @@ class ChoiceFieldRenderer(object): self.choices = choices def __getitem__(self, idx): - choice = list(self.choices)[idx] # Let the IndexError propagate - return self.choice_input_class(self.name, self.value, self.attrs.copy(), choice, idx) + return list(self)[idx] + + def __iter__(self): + for idx, choice in enumerate(self.choices): + yield self.choice_input_class(self.name, self.value, self.attrs.copy(), choice, idx) def __str__(self): return self.render() diff --git a/docs/releases/1.10.1.txt b/docs/releases/1.10.1.txt index 66ff4707f7..58619492a7 100644 --- a/docs/releases/1.10.1.txt +++ b/docs/releases/1.10.1.txt @@ -20,3 +20,6 @@ Bugfixes * Fixed a checks framework crash with an empty ``Meta.default_permissions`` (:ticket:`26997`). + +* Fixed a regression in the number of queries when using ``RadioSelect`` with a + ``ModelChoiceField`` form field (:ticket:`27001`). diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 3d65c104ff..8c706f1a56 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -1576,6 +1576,14 @@ class ModelChoiceFieldTests(TestCase): field = CustomModelChoiceField(Category.objects.all()) self.assertIsInstance(field.choices, CustomModelChoiceIterator) + def test_radioselect_num_queries(self): + class CategoriesForm(forms.Form): + categories = forms.ModelChoiceField(Category.objects.all(), widget=forms.RadioSelect) + + template = Template('{% for widget in form.categories %}{{ widget }}{% endfor %}') + with self.assertNumQueries(2): + template.render(Context({'form': CategoriesForm()})) + class ModelMultipleChoiceFieldTests(TestCase): def setUp(self):