Login

SectionedForm

Author:
marinho
Posted:
June 13, 2008
Language:
Python
Version:
.96
Score:
3 (after 3 ratings)

Sometimes we need divide forms in fieldsets, but this make us declare all fields in HTML template manually.

This class is to help you to do this by a easy way.

How to use

First, download this file as name "sectioned_form.py"

Later, turn your form inherited from the class SectionedForm, override method "_html_output" and declare fieldsets and fieldset_template attribute, like below:

from sectioned_form import SectionedForm

class MyForm(forms.ModelForm, SectionedForm):
    fieldsets = (
        (None, ('name','age','date')),
        (_('Documents'), ('number','doc_id')),
    )
    fieldset_template = "<h2>%s</h2>"

    def _html_output(self, *args, **kwargs):
        return SectionedForm._html_output(self, *args, **kwargs)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from django import newforms as forms
from django.newforms.forms import BoundField
from django.utils.html import escape
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe

class SectionedForm(object):
    fieldsets = ()
    fieldset_template = "<h3>%s</h3>"

    def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row):
        "Helper function for outputting HTML. Used by as_table(), as_ul(), as_p()."
        top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
        output, hidden_fields = [], []

        for fieldset, fields in self.fieldsets:
            if fieldset:
                output.append(normal_row % {'errors': '', 'label': '&nbsp;', 'field': self.fieldset_template % fieldset, 'help_text': ''})

            for name, field in [i for i in self.fields.items() if i[0] in fields]:
                bf = BoundField(self, field, name)
                bf_errors = self.error_class([escape(error) for error in bf.errors]) # Escape and cache in local variable.
                if bf.is_hidden:
                    if bf_errors:
                        top_errors.extend([u'(Hidden field %s) %s' % (name, force_unicode(e)) for e in bf_errors])
                    hidden_fields.append(unicode(bf))
                else:
                    if errors_on_separate_row and bf_errors:
                        output.append(error_row % force_unicode(bf_errors))
                    if bf.label:
                        label = escape(force_unicode(bf.label))
                        # Only add the suffix if the label does not end in
                        # punctuation.
                        if self.label_suffix:
                            if label[-1] not in ':?.!':
                                label += self.label_suffix
                        label = bf.label_tag(label) or ''
                    else:
                        label = ''
                    if field.help_text:
                        help_text = help_text_html % force_unicode(field.help_text)
                    else:
                        help_text = u''
                    output.append(normal_row % {'errors': force_unicode(bf_errors), 'label': force_unicode(label), 'field': unicode(bf), 'help_text': help_text})

        if top_errors:
            output.insert(0, error_row % force_unicode(top_errors))
        if hidden_fields: # Insert any hidden fields in the last row.
            str_hidden = u''.join(hidden_fields)
            if output:
                last_row = output[-1]
                # Chop off the trailing row_ender (e.g. '</td></tr>') and
                # insert the hidden fields.
                output[-1] = last_row[:-len(row_ender)] + str_hidden + row_ender
            else:
                # If there aren't any rows in the output, just append the
                # hidden fields.
                output.append(str_hidden)
        return mark_safe(u'\n'.join(output))

More like this

  1. Template tag - list punctuation for a list of items by shapiromatron 2 months ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 2 months, 1 week ago
  3. Serializer factory with Django Rest Framework by julio 9 months, 1 week ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 9 months, 4 weeks ago
  5. Help text hyperlinks by sa2812 10 months, 3 weeks ago

Comments

marinho (on August 8, 2008):

Variables sections and section_template changed to fieldsets and fieldset_template.

#

Please login first before commenting.