class PartiallyRequiredForm(Form):
    f = PartiallyRequiredField(
        fields=(CharField(required=True), CharField(required=False)),
        required=True,
        require_all_fields=False,
        widget=MultiWidget(widgets=[TextInput(), TextInput()]),
    )
Example #2
0
 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" />
         """
     ))
Example #3
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,
             )
Example #4
0
 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,
             )
Example #5
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,
             )
Example #6
0
 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,
             )
Example #7
0
 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>"""
     ))
Example #8
0
 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">'
          ))
Example #9
0
 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">'
          ),
     )
Example #10
0
 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>
     """,
     )
Example #11
0
 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)
Example #12
0
 def render(self, name, value, attrs=None):
     output = MultiWidget.render(self, name, value)
     output = output.replace("/><i", "/>~<i")
     print output
     return output