class PartiallyRequiredForm(Form): f = PartiallyRequiredField( fields=(CharField(required=True), CharField(required=False)), required=True, require_all_fields=False, widget=MultiWidget(widgets=[TextInput(), TextInput()]), )
def test_render_as_subwidget(self): """A ClearableFileInput as a subwidget of MultiWidget.""" widget = MultiWidget(widgets=(self.widget,)) self.check_html(widget, 'myfile', [FakeFieldFile()], html=( """ Currently: <a href="something">something</a> <input type="checkbox" name="myfile_0-clear" id="myfile_0-clear_id" /> <label for="myfile_0-clear_id">Clear</label><br /> Change: <input type="file" name="myfile_0" /> """ ))
def test_value_omitted_from_data_subwidgets_name(self): widget = MultiWidget(widgets={"x": TextInput(), "": TextInput()}) tests = [ ({}, True), ({ "field": "x" }, False), ({ "field_x": "y" }, False), ({ "field": "x", "field_x": "y" }, False), ] for data, expected in tests: with self.subTest(data): self.assertIs( widget.value_omitted_from_data(data, {}, "field"), expected, )
def test_value_from_datadict_subwidgets_name(self): widget = MultiWidget(widgets={"x": TextInput(), "": TextInput()}) tests = [ ({}, [None, None]), ({ "field": "x" }, [None, "x"]), ({ "field_x": "y" }, ["y", None]), ({ "field": "x", "field_x": "y" }, ["y", "x"]), ] for data, expected in tests: with self.subTest(data): self.assertEqual( widget.value_from_datadict(data, {}, "field"), expected, )
def test_value_omitted_from_data_subwidgets_name(self): widget = MultiWidget(widgets={'x': TextInput(), '': TextInput()}) tests = [ ({}, True), ({ 'field': 'x' }, False), ({ 'field_x': 'y' }, False), ({ 'field': 'x', 'field_x': 'y' }, False), ] for data, expected in tests: with self.subTest(data): self.assertIs( widget.value_omitted_from_data(data, {}, 'field'), expected, )
def test_value_from_datadict_subwidgets_name(self): widget = MultiWidget(widgets={'x': TextInput(), '': TextInput()}) tests = [ ({}, [None, None]), ({ 'field': 'x' }, [None, 'x']), ({ 'field_x': 'y' }, ['y', None]), ({ 'field': 'x', 'field_x': 'y' }, ['y', 'x']), ] for data, expected in tests: with self.subTest(data): self.assertEqual( widget.value_from_datadict(data, {}, 'field'), expected, )
def test_render_as_subwidget(self): """A RadioSelect as a subwidget of MultiWidget.""" choices = (('', '------'),) + self.beatles self.check_html(MultiWidget([self.widget(choices=choices)]), 'beatle', ['J'], html=( """<ul> <li><label><input type="radio" name="beatle_0" value=""> ------</label></li> <li><label><input checked type="radio" name="beatle_0" value="J"> John</label></li> <li><label><input type="radio" name="beatle_0" value="P"> Paul</label></li> <li><label><input type="radio" name="beatle_0" value="G"> George</label></li> <li><label><input type="radio" name="beatle_0" value="R"> Ringo</label></li> </ul>""" ))
def test_subwidgets_name(self): widget = MultiWidget(widgets={ '': TextInput(), 'big': TextInput(attrs={'class': 'big'}), 'small': TextInput(attrs={'class': 'small'}), }, ) self.check_html( widget, 'name', ['John', 'George', 'Paul'], html= ('<input type="text" name="name" value="John">' '<input type="text" name="name_big" value="George" class="big">' '<input type="text" name="name_small" value="Paul" class="small">' ))
def test_subwidgets_name(self): widget = MultiWidget(widgets={ "": TextInput(), "big": TextInput(attrs={"class": "big"}), "small": TextInput(attrs={"class": "small"}), }, ) self.check_html( widget, "name", ["John", "George", "Paul"], html= ('<input type="text" name="name" value="John">' '<input type="text" name="name_big" value="George" class="big">' '<input type="text" name="name_small" value="Paul" class="small">' ), )
def test_render_as_subwidget(self): """A RadioSelect as a subwidget of MultiWidget.""" choices = (("", "------"), ) + self.beatles self.check_html( MultiWidget([self.widget(choices=choices)]), "beatle", ["J"], html=""" <div> <div><label> <input type="radio" name="beatle_0" value=""> ------</label></div> <div><label> <input checked type="radio" name="beatle_0" value="J"> John</label></div> <div><label> <input type="radio" name="beatle_0" value="P"> Paul</label></div> <div><label> <input type="radio" name="beatle_0" value="G"> George</label></div> <div><label> <input type="radio" name="beatle_0" value="R"> Ringo</label></div> </div> """, )
def __init__(self, attrs=None): widgets = [CustomDateWidget, CustomTimeWidget] # Note that we're calling MultiWidget, not SplitDateTimeWidget, because # we want to define widgets. MultiWidget.__init__(self, widgets, attrs)
def render(self, name, value, attrs=None): output = MultiWidget.render(self, name, value) output = output.replace("/><i", "/>~<i") print output return output