Login

Allow disabling options in a select widget

Author:
scjody
Posted:
June 3, 2011
Language:
Python
Version:
1.3
Tags:
subclass select widget
Score:
3 (after 3 ratings)

HTML allows an option in a <select> to be disabled. In other words it will appear in the list of choices but won't be selectable. This is done by adding a 'disabled' attribute to the <option> tag, for example: <option value="" disabled="disabled">Disabled option</option>

This code subclasses the regular Django Select widget, overriding the render_option method to allow disabling options.

Example of usage:

class FruitForm(forms.Form):
    choices = (('apples', 'Apples'),
               ('oranges', 'Oranges'),
               ('bananas', {'label': 'Bananas',
                            'disabled': True}),    # Yes, we have no bananas
               ('grobblefruit', 'Grobblefruit'))

    fruit = forms.ChoiceField(choices=choices, widget=SelectWithDisabled())
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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'<option value="%s"%s%s>%s</option>' % (
            escape(option_value), selected_html, disabled_html,
            conditional_escape(force_unicode(option_label)))

More like this

  1. CheckboxMultiSelect with interable checkboxes by pyramids16 2 years, 6 months ago
  2. DisableableSelectWidget by notanumber 3 years ago
  3. Dynamically change a form select widget to a hidden widget by epicserve 5 years, 10 months ago
  4. Allow disabling options in a checkboxselectmultiple widget by sterkh 2 years, 10 months ago
  5. SelectDateWidget by silent1mezzo 4 years, 5 months ago

Comments

Please login first before commenting.