Fixed #23712 -- Fixed KeyError with BaseForm._html_output()

This commit is contained in:
Yang Liu 2015-01-06 17:07:40 +08:00 committed by Tim Graham
parent faf0d66a80
commit 3f9ec12d9c
2 changed files with 62 additions and 3 deletions

View File

@ -251,9 +251,14 @@ class BaseForm(object):
# that users write): if there are only top errors, we may # that users write): if there are only top errors, we may
# not be able to conscript the last row for our purposes, # not be able to conscript the last row for our purposes,
# so insert a new, empty row. # so insert a new, empty row.
last_row = (normal_row % {'errors': '', 'label': '', last_row = (normal_row % {
'field': '', 'help_text': '', 'errors': '',
'html_class_attr': html_class_attr}) 'label': '',
'field': '',
'help_text': '',
'html_class_attr': html_class_attr,
'field_name': '',
})
output.append(last_row) output.append(last_row)
output[-1] = last_row[:-len(row_ender)] + str_hidden + row_ender output[-1] = last_row[:-len(row_ender)] + str_hidden + row_ender
else: else:

View File

@ -2191,6 +2191,60 @@ class FormsTestCase(TestCase):
form = SomeForm() form = SomeForm()
self.assertHTMLEqual(form.as_p(), '<p id="p_some_field"></p>') self.assertHTMLEqual(form.as_p(), '<p id="p_some_field"></p>')
def test_field_name_with_hidden_input(self):
"""
BaseForm._html_output() should merge all the hidden input fields and
put them in the last row.
"""
class SomeForm(Form):
hidden1 = CharField(widget=HiddenInput)
custom = CharField()
hidden2 = CharField(widget=HiddenInput)
def as_p(self):
return self._html_output(
normal_row='<p%(html_class_attr)s>%(field)s %(field_name)s</p>',
error_row='%s',
row_ender='</p>',
help_text_html=' %s',
errors_on_separate_row=True,
)
form = SomeForm()
self.assertHTMLEqual(
form.as_p(),
'<p><input id="id_custom" name="custom" type="text" /> custom'
'<input id="id_hidden1" name="hidden1" type="hidden" />'
'<input id="id_hidden2" name="hidden2" type="hidden" /></p>'
)
def test_field_name_with_hidden_input_and_non_matching_row_ender(self):
"""
BaseForm._html_output() should merge all the hidden input fields and
put them in the last row ended with the specific row ender.
"""
class SomeForm(Form):
hidden1 = CharField(widget=HiddenInput)
custom = CharField()
hidden2 = CharField(widget=HiddenInput)
def as_p(self):
return self._html_output(
normal_row='<p%(html_class_attr)s>%(field)s %(field_name)s</p>',
error_row='%s',
row_ender='<hr/><hr/>',
help_text_html=' %s',
errors_on_separate_row=True
)
form = SomeForm()
self.assertHTMLEqual(
form.as_p(),
'<p><input id="id_custom" name="custom" type="text" /> custom</p>\n'
'<input id="id_hidden1" name="hidden1" type="hidden" />'
'<input id="id_hidden2" name="hidden2" type="hidden" /><hr/><hr/>'
)
def test_error_dict(self): def test_error_dict(self):
class MyForm(Form): class MyForm(Form):
foo = CharField() foo = CharField()