form: add effective use of <label> in more places

This commit is contained in:
Frédéric Péters 2013-01-20 20:43:12 +01:00 committed by Thomas NOEL
parent a7b4f461b6
commit 9a3a679048
1 changed files with 72 additions and 2 deletions

View File

@ -84,6 +84,16 @@ def is_prefilled(self):
else:
return False
def render_title(self, title):
if title:
if self.required:
title += htmltext('<span class="required">*</span>')
return htmltext('<div class="title"><label for="form_%s">%s</label></div>') % (
self.name, title)
else:
return ''
def render(self):
# quixote/form/widget.py, Widget::render
r = TemplateIO(html=True)
@ -121,8 +131,65 @@ Widget.cleanup = None
Widget.set_message = set_message
Widget.get_message = get_message
Widget.render_message = render_message
Widget.render_title = render_title
Widget.is_prefilled = is_prefilled
def string_render_content(self):
attrs = {'id': 'form_' + self.name}
if self.attrs:
attrs.update(self.attrs)
return htmltag("input", xml_end=True, type=self.HTML_TYPE, name=self.name,
value=self.value, **attrs)
StringWidget.render_content = string_render_content
def file_render_content(self):
attrs = {'id': 'form_' + self.name.split('$')[0]}
if self.attrs:
attrs.update(self.attrs)
return htmltag("input", xml_end=True, type=self.HTML_TYPE, name=self.name,
value=self.value, **attrs)
FileWidget.render_content = file_render_content
def text_render_content(self):
attrs = {'id': 'form_' + self.name}
if self.attrs:
attrs.update(self.attrs)
return (htmltag("textarea", name=self.name, **attrs) +
htmlescape(self.value or "") + htmltext("</textarea>"))
TextWidget.render_content = text_render_content
def checkbox_render_content(self):
attrs = {'id': 'form_' + self.name}
if self.attrs:
attrs.update(self.attrs)
return htmltag("input", xml_end=True, type="checkbox", name=self.name,
value="yes", checked=self.value and "checked" or None,
**attrs)
CheckboxWidget.render_content = checkbox_render_content
def select_render_content(self):
attrs = {'id': 'form_' + self.name}
if self.attrs:
attrs.update(self.attrs)
tags = [htmltag("select", name=self.name, **attrs)]
for object, description, key in self.options:
if self.is_selected(object):
selected = 'selected'
else:
selected = None
if description is None:
description = ""
r = htmltag("option", value=key, selected=selected)
tags.append(r + htmlescape(description) + htmltext('</option>'))
tags.append(htmltext("</select>"))
return htmltext("\n").join(tags)
SelectWidget.render_content = select_render_content
class Form(QuixoteForm):
TOKEN_NOTICE = N_(
"The form you have submitted is invalid. Most "
@ -683,7 +750,7 @@ $.dpText = {
prepare_javascript = classmethod(prepare_javascript)
def render_content(self):
self.attrs['id'] = 'id_%s' % self.name
self.attrs['id'] = 'form_%s' % self.name
self.attrs['class'] = 'date-pick'
if self.attrs.get('readonly') or not self.jquery:
@ -1167,9 +1234,12 @@ class SingleSelectHintWidget(SingleSelectWidget):
return (self.hint and len(self.hint) > 80)
def render_content(self):
attrs = {'id': 'form_' + self.name}
if self.attrs:
attrs.update(self.attrs)
if self.separate_hint():
return SingleSelectWidget.render_content(self)
tags = [htmltag('select', name=self.name, **self.attrs)]
tags = [htmltag('select', name=self.name, **attrs)]
if self.hint:
r = htmltag('option', value='', selected=None)
tags.append(r + htmlescape(self.hint) + htmltext('</option>'))