~mailmanweb-django/+junk/dev

« back to all changes in this revision

Viewing changes to fieldset_forms.py

  • Committer: Anna Granudd
  • Date: 2010-07-24 17:04:05 UTC
  • Revision ID: anna@athena-20100724170405-8xiqqv502ozeqzq6
Changed function names and calls in the view to make it work with the new rest-client.

Added the possibility to use fieldsets and divs in forms, by using as_div in the form.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
from django.forms import Form
 
3
from django.utils import safestring
 
4
from django.forms.forms import BoundField
 
5
 
 
6
class FieldsetForm(Form):
 
7
    """Extends BaseForm and adds fieldsets and the possibililty to use 
 
8
    as_div. Inspired by WTForm."""
 
9
 
 
10
    def __init__(self, *args):
 
11
        """Initialize a FormsetField."""
 
12
        super(FieldsetForm, self).__init__(*args)
 
13
        if hasattr(self, 'Meta') and hasattr(self.Meta, 'layout'):
 
14
            assert hasattr(self.Meta.layout, '__getitem__'), "Meta.layout must be iterable"
 
15
            self.layout = self.Meta.layout
 
16
        else:
 
17
            self.layout = self.fields.keys()
 
18
 
 
19
    def as_div(self):
 
20
        """Render the form as a set of <div>s."""
 
21
        output = ""
 
22
        # first, create the fieldsets
 
23
        for index in range(len(self.layout)):
 
24
            output += self.create_fieldset(self.layout[index])
 
25
        return safestring.mark_safe(output)
 
26
 
 
27
    def create_fieldset(self, field):
 
28
        """Create a <fieldset> around a number of field instances."""
 
29
        # create the divs in each fieldset by calling create_divs
 
30
        return u'<fieldset><legend>%s</legend>%s</fieldset>' % (field[0], 
 
31
                                                                self.create_divs(field[1:]))
 
32
    
 
33
    def create_divs(self, fields):
 
34
        """Create a <div> for each field."""
 
35
        output = ""
 
36
        for field in fields:
 
37
            try:
 
38
                # create a field instance for the bound field
 
39
                field_instance = self.base_fields[field]
 
40
            except KeyError:
 
41
                print "Could not resolve form field '%s'." % field
 
42
            # create a bound field containing all the necessary fields 
 
43
            # from the model
 
44
            bound_field = BoundField(self, field_instance, field)
 
45
            output += '<div class="field %(class)s">%(label)s%(help_text)s%(errors)s%(field)s</div>\n' % \
 
46
                     {'class': bound_field.name, 
 
47
                      'label': bound_field.label, 
 
48
                      'help_text': bound_field.help_text, 
 
49
                      'errors': bound_field.errors, 
 
50
                      'field': unicode(bound_field)}
 
51
        return output