def render(self, name, value, attrs=None, choices=()):
if value is None:
value = []
has_id = attrs and 'id' in attrs
final_attrs = self.build_attrs(attrs, name=name)
output = []
# Normalize to strings
str_values = set([force_unicode(v) for v in value])
for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
# If an ID attribute was given, add a numeric index as a suffix,
# so that the checkboxes don't all have the same ID attribute.
if has_id:
final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
label_for = u' for="%s"' % final_attrs['id']
else:
label_for = ''
cb = widgets.CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
option_value = force_unicode(option_value)
rendered_cb = cb.render(name, option_value)
option_label = conditional_escape(force_unicode(option_label))
output.append(u'<label class="%s"%s>%s %s</label>' % (self.label_class,
label_for, rendered_cb, option_label))
return mark_safe(u'\n'.join(output))
python类CheckboxInput()的实例源码
def test_DictCharWidget_renders_fieldset_with_label_and_field_names(self):
names = [factory.make_string(), factory.make_string()]
initials = []
labels = [factory.make_string(), factory.make_string()]
values = [factory.make_string(), factory.make_string()]
widget = DictCharWidget(
[widgets.TextInput, widgets.TextInput, widgets.CheckboxInput],
names, initials, labels, skip_check=True)
name = factory.make_string()
html_widget = fromstring(
'<root>' + widget.render(name, values) + '</root>')
widget_names = XPath('fieldset/input/@name')(html_widget)
widget_labels = XPath('fieldset/label/text()')(html_widget)
widget_values = XPath('fieldset/input/@value')(html_widget)
expected_names = [
"%s_%s" % (name, widget_name) for widget_name in names]
self.assertEqual(
[expected_names, labels, values],
[widget_names, widget_labels, widget_values])
def test_DictCharWidget_renders_with_empty_string_as_input_data(self):
names = [factory.make_string(), factory.make_string()]
initials = []
labels = [factory.make_string(), factory.make_string()]
widget = DictCharWidget(
[widgets.TextInput, widgets.TextInput, widgets.CheckboxInput],
names, initials, labels, skip_check=True)
name = factory.make_string()
html_widget = fromstring(
'<root>' + widget.render(name, '') + '</root>')
widget_names = XPath('fieldset/input/@name')(html_widget)
widget_labels = XPath('fieldset/label/text()')(html_widget)
expected_names = [
"%s_%s" % (name, widget_name) for widget_name in names]
self.assertEqual(
[expected_names, labels],
[widget_names, widget_labels])
def is_widget_required_attribute(widget):
"""
Is this widget required?
"""
if not widget.is_required:
return False
if isinstance(widget, (AdminFileWidget, HiddenInput, FileInput, CheckboxInput, CheckboxSelectMultiple)):
return False
return True
def is_checkbox(field):
return isinstance(field.field.widget, CheckboxInput)
def value_from_datadict(self, data, files, name):
"""
Modify value_from_datadict, so that delete takes precedence over
upload.
"""
file_value = super(widgets.ClearableFileInput, self)\
.value_from_datadict(data, files, name)
checkbox_value = widgets.CheckboxInput()\
.value_from_datadict(data, files, self.clear_checkbox_name(name))
if not self.is_required and checkbox_value:
return False
return file_value
def value_from_datadict(self, data, files, name):
file_value = super(widgets.ClearableFileInput, self) \
.value_from_datadict(data, files, name)
checkbox_value = widgets.CheckboxInput() \
.value_from_datadict(data, files, self.clear_checkbox_name(name))
if not self.is_required and checkbox_value:
return False
return file_value
def test_empty_DictCharWidget_renders_as_empty_string(self):
widget = DictCharWidget(
[widgets.CheckboxInput], [], [], [], skip_check=True)
self.assertEqual('', widget.render(factory.make_string(), ''))
def is_checkbox(value):
if not isinstance(value, BoundField):
return False
return isinstance(value.field.widget, CheckboxInput)
def render(self, name, value, attrs=None):
if self.is_localized:
for widget in self.widgets:
widget.is_localized = self.is_localized
# value is a list of values, each corresponding to a widget
# in self.widgets.
if not isinstance(value, list):
value = self.decompress(value)
output = []
final_attrs = self.build_attrs(attrs)
id_ = final_attrs.get('id', None)
output.append('<table class="table table-striped table-bordered table-hover table-condensed" style="width: 50%; margin: 0">')
for i, widget in enumerate(self.widgets):
try:
widget_value = value[i]
except IndexError:
widget_value = None
field = widget.attrs.pop('field', None)
final_attrs['style'] = 'width: auto'
if type(widget) in (widgets.CheckboxInput, ):
if widget_value == 'false':
widget_value = None
if id_:
final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
output.append('<tr>')
output.append('<td style="width: 30%">')
if field:
output.append('<label>%s</label>' % field.label)
output.append('</td>')
output.append('<td>')
output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
if field.help_text:
output.append('<p class="help-block">')
output.append(field.help_text)
output.append('</p>')
output.append('</td>')
output.append('<tr>')
output.append('</table>')
return mark_safe(self.format_output(output))
def render(self, name, value, attrs=None):
html_id = attrs and attrs.get('id', name) or name
has_image_set = self.is_initial(value)
is_required = self.is_required
file_placeholder = ugettext('Select a picture from your local folder.')
file_input = super().render(name, None, {
'id': html_id,
'class': 'form-control form-control-file'
})
if has_image_set:
file_name = basename(value.name)
file_url = conditional_escape(value.url)
else:
file_name = ""
file_url = ""
text_input = widgets.TextInput().render('__noname__', file_name, {
'class': 'form-control form-control-file-dummy',
'placeholder': file_placeholder,
'tabindex': '-1',
'id': 'text-{}'.format(html_id)
})
checkbox_id = self.clear_checkbox_id(name)
checkbox_name = self.clear_checkbox_name(name)
checkbox_input = widgets.CheckboxInput().render(checkbox_name, False, {
'id': checkbox_id,
'class': 'clear-image',
'data-upload-clear': html_id,
})
context = {
'id': html_id,
'has_image_set': has_image_set,
'is_required': is_required,
'file_url': file_url,
'file_input': file_input,
'file_id': html_id + '-file',
'text_input': text_input,
'checkbox_input': checkbox_input,
'checkbox_id': checkbox_id
}
return loader.render_to_string(
'a4images/image_upload_widget.html',
context
)
def render(self, name, value, attrs=None):
has_file_set = self.is_initial(value)
is_required = self.is_required
file_placeholder = ugettext('Select a file from your local folder.')
file_input = super().render(name, None, {
'id': name,
'class': 'form-control form-control-file'
})
if has_file_set:
file_name = basename(value.name)
file_url = conditional_escape(value.url)
else:
file_name = ""
file_url = ""
text_input = widgets.TextInput().render('__noname__', file_name, {
'class': 'form-control form-control-file-dummy',
'placeholder': file_placeholder
})
checkbox_id = self.clear_checkbox_id(name)
checkbox_name = self.clear_checkbox_name(name)
checkbox_input = widgets.CheckboxInput().render(checkbox_name, False, {
'id': checkbox_id,
'class': 'clear-image',
'data-upload-clear': name,
})
context = {
'name': name,
'has_image_set': has_file_set,
'is_required': is_required,
'file_url': file_url,
'file_input': file_input,
'file_id': name + '-file',
'text_input': text_input,
'checkbox_input': checkbox_input,
'checkbox_id': checkbox_id
}
return mark_safe(
loader.render_to_string(
'euth_offlinephases/file_upload_widget.html',
context
)
)