Code

Ticket #3512: html_class3.diff

File html_class3.diff, 3.2 KB (added by Waylan Limberg <waylan@…>, 7 years ago)

Adds another argument to _as_html() but is easy to override and clean.

Line 
1Index: forms.py
2===================================================================
3--- forms.py    (revision 4528)
4+++ forms.py    (working copy)
5@@ -107,7 +107,7 @@
6         """
7         return self.prefix and ('%s-%s' % (self.prefix, field_name)) or field_name
8 
9-    def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row):
10+    def _html_output(self, normal_row, error_row, row_ender, help_text_html, html_class_list, errors_on_separate_row):
11         "Helper function for outputting HTML. Used by as_table(), as_ul(), as_p()."
12         top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
13         output, hidden_fields = [], []
14@@ -119,6 +119,15 @@
15                     top_errors.extend(['(Hidden field %s) %s' % (name, e) for e in bf_errors])
16                 hidden_fields.append(unicode(bf))
17             else:
18+                class_list = html_class_list #reset for each loop
19+                if bf_errors:
20+                    class_list += ' error'
21+                if bf.field.required:
22+                    class_list += ' required'
23+                if class_list:
24+                    html_class = ' class="%s"'% class_list.strip()
25+                else:
26+                    html_class = ''
27                 if errors_on_separate_row and bf_errors:
28                     output.append(error_row % bf_errors)
29                 label = bf.label and bf.label_tag(escape(bf.label + ':')) or ''
30@@ -126,7 +135,7 @@
31                     help_text = help_text_html % field.help_text
32                 else:
33                     help_text = u''
34-                output.append(normal_row % {'errors': bf_errors, 'label': label, 'field': unicode(bf), 'help_text': help_text})
35+                output.append(normal_row % {'errors': bf_errors, 'label': label, 'field': unicode(bf), 'help_text': help_text, 'html_class': html_class})
36         if top_errors:
37             output.insert(0, error_row % top_errors)
38         if hidden_fields: # Insert any hidden fields in the last row.
39@@ -141,15 +150,15 @@
40 
41     def as_table(self):
42         "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
43-        return self._html_output(u'<tr><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>', u'<tr><td colspan="2">%s</td></tr>', '</td></tr>', u'<br />%s', False)
44+        return self._html_output(u'<tr%(html_class)s><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>', u'<tr><td colspan="2">%s</td></tr>', '</td></tr>', u'<br />%s', u'', False)
45 
46     def as_ul(self):
47         "Returns this form rendered as HTML <li>s -- excluding the <ul></ul>."
48-        return self._html_output(u'<li>%(errors)s%(label)s %(field)s%(help_text)s</li>', u'<li>%s</li>', '</li>', u' %s', False)
49+        return self._html_output(u'<li%(html_class)s>%(errors)s%(label)s %(field)s%(help_text)s</li>', u'<li>%s</li>', '</li>', u' %s', u'', False)
50 
51     def as_p(self):
52         "Returns this form rendered as HTML <p>s."
53-        return self._html_output(u'<p>%(label)s %(field)s%(help_text)s</p>', u'<p>%s</p>', '</p>', u' %s', True)
54+        return self._html_output(u'<p%(html_class)s>%(label)s %(field)s%(help_text)s</p>', u'<p>%s</p>', '</p>', u' %s', u'', True)
55 
56     def non_field_errors(self):
57         """