27 from itertools
import chain
29 from django.forms.widgets
import Select, CheckboxSelectMultiple, CheckboxInput
30 from django.utils.encoding
import force_unicode
31 from django.utils.html
import escape, conditional_escape
32 from django.utils.safestring
import mark_safe
33 from django.utils.translation
import ugettext
as _
50 option_value = force_unicode(option_value)
51 if (option_value
in selected_choices):
52 selected_html =
u' selected="selected"'
56 if isinstance(option_label, dict):
57 if dict.get(option_label,
'disabled'):
58 disabled_html =
u' disabled="disabled"'
59 option_label = option_label[
'label']
60 return u'<option value="%s"%s%s>%s</option>' % (
61 escape(option_value), selected_html, disabled_html,
62 conditional_escape(force_unicode(option_label)))
70 def render(self, name, value, attrs=None, choices=()):
73 has_id = attrs
and 'id' in attrs
74 final_attrs = self.build_attrs(attrs, name=name)
75 output = [
u'<ul class="multipleCheckBox %s">' % (
u'disabled' if len(self.choices) == 0
else u'')]
77 if len(self.choices) == 0:
78 output.append(
u'<li><label> %s </label></li>' % (_(
'none available')))
81 str_values = set([force_unicode(v)
for v
in value])
82 for i, (option_value, option_label)
in enumerate(chain(self.choices, choices)):
86 final_attrs = dict(final_attrs, id=
'%s_%s' % (attrs[
'id'], i))
87 label_for =
u' for="%s"' % final_attrs[
'id']
91 chb = CheckboxInput(final_attrs, check_test=
lambda value: value
in str_values)
94 if isinstance(option_label, dict):
95 if dict.get(option_label,
'disabled'):
96 chb.attrs[
'disabled'] =
'disabled'
98 option_label = option_label[
'label']
100 option_value = force_unicode(option_value)
101 rendered_cb = chb.render(name, option_value)
102 option_label = conditional_escape(force_unicode(option_label))
103 output.append(
u'<li class="%s"><label%s>%s %s</label></li>' % (li_class, label_for, rendered_cb, option_label))
105 output.append(
u'</ul>')
106 return mark_safe(
u'\n'.join(output))