def textfield(self, name, value=None, **kw): kwargs = dict(name=name, type='text') if value is not None: kwargs['value'] = value kwargs['size'] = '%d' % len(value) kwargs.update(kw) return markup.input(None, **kwargs)
def checkboxes(self, name, items, checked=set()): retval = [] checked = set(checked) for item in items: kw = { 'name': name, 'value': item, 'type': 'checkbox' } if item in checked: kw['checked'] = 'checked' # XXX hacky; ideally, one would use a list with no bullets retval.append('%s%s<br/>' % (markup.input(None, **kw), item)) return '\n'.join(retval)
def __call__(self, errors=None): """render the form""" retval = StringIO() print >> retval def name_field(element): if not element['name']: return '' title={} help = element.get('help') if help: title['title'] = help return markup.span(markup.strong('%s:' % element['name']), **title) # print the form as a table table = [ [ name_field(element), element['html'] ] for element in self.elements ] if errors: for row, element in zip(table, self.elements): error = errors.get(element['name'], '') if error: if not isinstance(error, basestring): if len(error) == 1: error = error[0] else: error = markup.listify(error) error = markup.div(error, **{ 'class': 'error' }) row.append(error) print >> retval, markup.tablify(table) print >> retval, self.post_html # each form has a submit button # XXX this should probably be more customizable print >> retval, markup.input(None, type='submit', name='submit', value=self.submit), args = { 'method': self.method, 'enctype': 'multipart/form-data'} if self.action is not None: args['action'] = self.action return markup.form(retval.getvalue(), **args)
def radiobuttons(self, name, items, checked=None, joiner='<br/>'): if checked is None: checked = items[0] joiner = "%s\n" % joiner retval = [] for item in items: title = None if hasattr(item, '__iter__'): item, title = item kw = dict(type='radio', name=name, value=item) if item == checked: kw['checked'] = None # display contextual help if title: title = dict(title=title) else: title = {} retval.append(markup.span('%s%s' % (item, markup.input(**kw)), **title)) return joiner.join(retval)
def file_upload(self, name): return markup.input(None, type='file', name=name)
def hidden(self, name, value): return markup.input(None, type='hidden', name=name, value=value)
def password(self, name): return markup.input(None, type='password', name=name)