diff --git a/django/forms/boundfield.py b/django/forms/boundfield.py index bcfe2e2a2d..6567c4f08f 100644 --- a/django/forms/boundfield.py +++ b/django/forms/boundfield.py @@ -60,7 +60,7 @@ class BoundField(object): def __getitem__(self, idx): # Prevent unnecessary reevaluation when accessing BoundField's attrs # from templates. - if not isinstance(idx, six.integer_types): + if not isinstance(idx, six.integer_types + (slice,)): raise TypeError return list(self.__iter__())[idx] diff --git a/docs/releases/1.8.10.txt b/docs/releases/1.8.10.txt index b63ae2abdc..c9fbd0470d 100644 --- a/docs/releases/1.8.10.txt +++ b/docs/releases/1.8.10.txt @@ -24,3 +24,5 @@ Bugfixes * Reallowed dashes in top-level domain names of URLs checked by ``URLValidator`` to fix a regression in Django 1.8 (:ticket:`26204`). + +* Fixed ``BoundField`` to reallow slices of subwidgets (:ticket:`26267`). diff --git a/docs/releases/1.9.3.txt b/docs/releases/1.9.3.txt index 1ce0096968..cd7d674864 100644 --- a/docs/releases/1.9.3.txt +++ b/docs/releases/1.9.3.txt @@ -40,3 +40,5 @@ Bugfixes * Fixed some crashing deprecation shims in ``SimpleTemplateResponse`` that regressed in Django 1.9 (:ticket:`26253`). + +* Fixed ``BoundField`` to reallow slices of subwidgets (:ticket:`26267`). diff --git a/docs/spelling_wordlist b/docs/spelling_wordlist index 90bddd50e0..9f547dfa70 100644 --- a/docs/spelling_wordlist +++ b/docs/spelling_wordlist @@ -632,6 +632,7 @@ quoteless Radziej rc readded +reallow reallowed rebase rebased diff --git a/tests/forms_tests/tests/test_forms.py b/tests/forms_tests/tests/test_forms.py index 17703f2d23..22675bb84b 100644 --- a/tests/forms_tests/tests/test_forms.py +++ b/tests/forms_tests/tests/test_forms.py @@ -661,6 +661,20 @@ class FormsTestCase(SimpleTestCase): f = BeatleForm(auto_id=False) self.assertHTMLEqual('\n'.join(str(bf) for bf in f['name']), '') + def test_boundfield_slice(self): + class BeatleForm(Form): + name = ChoiceField( + choices=[('john', 'John'), ('paul', 'Paul'), ('george', 'George'), ('ringo', 'Ringo')], + widget=RadioSelect, + ) + + f = BeatleForm() + bf = f['name'] + self.assertEqual( + [str(item) for item in bf[1:]], + [str(bf[1]), str(bf[2]), str(bf[3])], + ) + def test_forms_with_multiple_choice(self): # MultipleChoiceField is a special case, as its data is required to be a list: class SongForm(Form):