from django import forms from django.core.exceptions import FieldError from django.template.loader import get_template from django.utils.safestring import mark_safe class CheckboxSelectMultipleWithSelectAll(forms.CheckboxSelectMultiple): def render(self, name, value, attrs=None, renderer=None): if 'id' not in attrs: raise FieldError('id required') select_all_id = attrs['id'] + '_all' select_all_name = name + '_all' original = super(CheckboxSelectMultipleWithSelectAll, self).render(name, value, attrs, renderer) template = get_template('widgets/select_all.html') return mark_safe(template.render({ 'original_widget': original, 'select_all_id': select_all_id, 'select_all_name': select_all_name, 'all_selected': all(choice[0] in value for choice in self.choices) if value else False, 'empty': not self.choices, }))