Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #9125 -- When displaying errors for a form with only hidden fie…

…lds, make sure the resulting XHTML is correct.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9067 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 9931c9e1321e3290b065bc0f5ec8353b1bcb71f3 1 parent eeb230a
@malcolmt malcolmt authored
View
7 django/forms/forms.py
@@ -171,6 +171,13 @@ def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_
last_row = output[-1]
# Chop off the trailing row_ender (e.g. '</td></tr>') and
# insert the hidden fields.
+ if not last_row.endswith(row_ender):
+ # This can happen in the as_p() case (and possibly others
+ # that users write): if there are only top errors, we may
+ # not be able to conscript the last row for our purposes,
+ # so insert a new, empty row.
+ last_row = normal_row % {'errors': '', 'label': '', 'field': '', 'help_text': ''}
+ output.append(last_row)
output[-1] = last_row[:-len(row_ender)] + str_hidden + row_ender
else:
# If there aren't any rows in the output, just append the
View
14 tests/regressiontests/forms/regressions.py
@@ -88,4 +88,18 @@
True
>>> f.cleaned_data
{'data': u'xyzzy'}
+
+A form with *only* hidden fields that has errors is going to be very unusual.
+But we can try to make sure it doesn't generate invalid XHTML. In this case,
+the as_p() method is the tricky one, since error lists cannot be nested
+(validly) inside p elements.
+
+>>> class HiddenForm(Form):
+... data = IntegerField(widget=HiddenInput)
+>>> f = HiddenForm({})
+>>> f.as_p()
+u'<ul class="errorlist"><li>(Hidden field data) This field is required.</li></ul>\n<p> <input type="hidden" name="data" id="id_data" /></p>'
+>>> f.as_table()
+u'<tr><td colspan="2"><ul class="errorlist"><li>(Hidden field data) This field is required.</li></ul><input type="hidden" name="data" id="id_data" /></td></tr>'
+
"""
Please sign in to comment.
Something went wrong with that request. Please try again.