from django.forms.widgets import Select from django.utils.encoding import force_unicode from django.utils.html import escape, conditional_escape class SelectWithDisabled(Select): """ Subclass of Django's select widget that allows disabling options. To disable an option, pass a dict instead of a string for its label, of the form: {'label': 'option label', 'disabled': True} """ def render_option(self, selected_choices, option_value, option_label): option_value = force_unicode(option_value) if (option_value in selected_choices): selected_html = u' selected="selected"' else: selected_html = '' disabled_html = '' if isinstance(option_label, dict): if dict.get(option_label, 'disabled'): disabled_html = u' disabled="disabled"' option_label = option_label['label'] return u'' % ( escape(option_value), selected_html, disabled_html, conditional_escape(force_unicode(option_label)))