From 6d8979f4c2fbfb9fd5db92acd72489cbbcbdd5d1 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Tue, 31 Jan 2017 06:41:51 -0800 Subject: Fixed #27758 -- Reallowed AdvancedModelIterator pattern after template widget rendering. --- tests/model_forms/tests.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'tests/model_forms') diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 9dd8e79513..afe94890c3 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -15,6 +15,7 @@ from django.forms.models import ( ModelChoiceIterator, ModelFormMetaclass, construct_instance, fields_for_model, model_to_dict, modelform_factory, ) +from django.forms.widgets import CheckboxSelectMultiple from django.template import Context, Template from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature @@ -1704,6 +1705,42 @@ class ModelChoiceFieldTests(TestCase): field = CustomModelChoiceField(Category.objects.all()) self.assertIsInstance(field.choices, CustomModelChoiceIterator) + def test_modelchoicefield_iterator_pass_model_to_widget(self): + class CustomModelChoiceValue: + def __init__(self, value, obj): + self.value = value + self.obj = obj + + def __str__(self): + return str(self.value) + + class CustomModelChoiceIterator(ModelChoiceIterator): + def choice(self, obj): + value, label = super().choice(obj) + return CustomModelChoiceValue(value, obj), label + + class CustomCheckboxSelectMultiple(CheckboxSelectMultiple): + def create_option(self, name, value, label, selected, index, subindex=None, attrs=None): + option = super().create_option(name, value, label, selected, index, subindex=None, attrs=None) + # Modify the HTML based on the object being rendered. + c = value.obj + option['attrs']['data-slug'] = c.slug + return option + + class CustomModelMultipleChoiceField(forms.ModelMultipleChoiceField): + iterator = CustomModelChoiceIterator + widget = CustomCheckboxSelectMultiple + + field = CustomModelMultipleChoiceField(Category.objects.all()) + self.assertHTMLEqual( + field.widget.render('name', []), + '''''' % (self.c1.pk, self.c2.pk, self.c3.pk), + ) + def test_modelchoicefield_num_queries(self): """ Widgets that render multiple subwidgets shouldn't make more than one -- cgit v1.3