diff options
| author | Alex Hill <alex@hill.net.au> | 2016-08-03 11:12:06 +0800 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-08-03 10:45:55 -0400 |
| commit | c5ebfda00226e3695cadbc13ea9ce4c5951d3ed0 (patch) | |
| tree | 4142734f609dc73ce3820392a077b8a9642141ef | |
| parent | 4e64e3bb6e96a50b057bc1144fba3efdee7dfc10 (diff) | |
Fixed #27001 -- Fixed a query count regression in ModelChoiceField with RadioSelect.
| -rw-r--r-- | django/forms/widgets.py | 7 | ||||
| -rw-r--r-- | docs/releases/1.10.1.txt | 3 | ||||
| -rw-r--r-- | tests/model_forms/tests.py | 8 |
3 files changed, 16 insertions, 2 deletions
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): |
