Index: tests/regressiontests/forms/widgets.py
===================================================================
--- tests/regressiontests/forms/widgets.py	(Revision 6913)
+++ tests/regressiontests/forms/widgets.py	(Arbeitskopie)
@@ -419,6 +419,17 @@
 <option value="4">4</option>
 </select>
 
+You can disable some choices by passing a subset of choices:
+>>> w = Select(choices=get_choices(), disable=[0])
+>>> print w.render('num', 2)
+<select name="num">
+<option value="0" disabled="disabled">0</option>
+<option value="1">1</option>
+<option value="2" selected="selected">2</option>
+<option value="3">3</option>
+<option value="4">4</option>
+</select>
+
 # NullBooleanSelect Widget ####################################################
 
 >>> w = NullBooleanSelect()
@@ -549,7 +560,18 @@
 <option value="3">3</option>
 </select>
 
+You can disable a subset of choices:
+>>> w = SelectMultiple(choices=[(1, 1), (2, 2), (3, 3)], disable=[1])
+>>> print w.render('nums', None)
+<select multiple="multiple" name="nums">
+<option value="1" disabled="disabled">1</option>
+<option value="2">2</option>
+<option value="3">3</option>
+</select>
+
+
 If 'choices' is passed to both the constructor and render(), then they'll both be in the output:
+>>> w = SelectMultiple(choices=[(1, 1), (2, 2), (3, 3)])
 >>> print w.render('nums', [2], choices=[(4, 4), (5, 5)])
 <select multiple="multiple" name="nums">
 <option value="1">1</option>
Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py	(Revision 6913)
+++ django/newforms/widgets.py	(Arbeitskopie)
@@ -201,13 +201,14 @@
         return super(CheckboxInput, self).value_from_datadict(data, files, name)
 
 class Select(Widget):
-    def __init__(self, attrs=None, choices=()):
+    def __init__(self, attrs=None, choices=(), disable=()):
         super(Select, self).__init__(attrs)
         # choices can be any iterable, but we may need to render this widget
         # multiple times. Thus, collapse it into a list so it can be consumed
         # more than once.
         self.choices = list(choices)
-
+        self.disable = set(disable)
+        
     def render(self, name, value, attrs=None, choices=()):
         if value is None: value = ''
         final_attrs = self.build_attrs(attrs, name=name)
@@ -215,10 +216,11 @@
         # Normalize to string.
         str_value = force_unicode(value)
         for option_value, option_label in chain(self.choices, choices):
+            disable_html = (option_value in self.disable) and ' disabled="disabled"' or ''
             option_value = force_unicode(option_value)
             selected_html = (option_value == str_value) and u' selected="selected"' or ''
-            output.append(u'<option value="%s"%s>%s</option>' % (
-                    escape(option_value), selected_html,
+            output.append(u'<option value="%s"%s%s>%s</option>' % (
+                    escape(option_value), selected_html, disable_html,
                     conditional_escape(force_unicode(option_label))))
         output.append(u'</select>')
         return mark_safe(u'\n'.join(output))
@@ -243,21 +245,23 @@
         return {u'2': True, u'3': False, True: True, False: False}.get(value, None)
 
 class SelectMultiple(Widget):
-    def __init__(self, attrs=None, choices=()):
+    def __init__(self, attrs=None, choices=(), disable=()):
         super(SelectMultiple, self).__init__(attrs)
         # choices can be any iterable
         self.choices = choices
-
+        self.disable = set(disable)
+        
     def render(self, name, value, attrs=None, choices=()):
         if value is None: value = []
         final_attrs = self.build_attrs(attrs, name=name)
         output = [u'<select multiple="multiple"%s>' % flatatt(final_attrs)]
         str_values = set([force_unicode(v) for v in value]) # Normalize to strings.
         for option_value, option_label in chain(self.choices, choices):
+            disable_html = (option_value in self.disable) and ' disabled="disabled"' or ''
             option_value = force_unicode(option_value)
             selected_html = (option_value in str_values) and ' selected="selected"' or ''
-            output.append(u'<option value="%s"%s>%s</option>' % (
-                    escape(option_value), selected_html,
+            output.append(u'<option value="%s"%s%s>%s</option>' % (
+                    escape(option_value), selected_html, disable_html,
                     conditional_escape(force_unicode(option_label))))
         output.append(u'</select>')
         return mark_safe(u'\n'.join(output))
Index: docs/newforms.txt
===================================================================
--- docs/newforms.txt	(Revision 6913)
+++ docs/newforms.txt	(Arbeitskopie)
@@ -1767,6 +1767,23 @@
         url = forms.URLField()
         comment = CommentInput()
 
+Select Widgets
+--------------
+
+The constructor of ``Select`` and the ``SelectMultiple`` widgets can
+be given a subset of choices which should be disabled.
+
+Example::
+
+    >>> w = SelectMultiple(choices=[(1, 1), (2, 2), (3, 3)], disable=[1])
+    >>> print w.render('nums', None)
+    <select multiple="multiple" name="nums">
+     <option value="1" disabled="disabled">1</option>
+     <option value="2">2</option>
+     <option value="3">3</option>
+    </select>
+
+
 Generating forms for models
 ===========================
 
