Index: django/forms/widgets.py
===================================================================
--- django/forms/widgets.py	(revision 16332)
+++ django/forms/widgets.py	(working copy)
@@ -503,12 +503,13 @@
         return bool(initial) != bool(data)
 
 class Select(Widget):
-    def __init__(self, attrs=None, choices=()):
+    def __init__(self, attrs=None, choices=(), disabled_choices=()):
         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.disabled_choices = frozenset(disabled_choices)
 
     def render(self, name, value, attrs=None, choices=()):
         if value is None: value = ''
@@ -522,9 +523,16 @@
 
     def render_option(self, selected_choices, option_value, option_label):
         option_value = force_unicode(option_value)
-        selected_html = (option_value in selected_choices) and u' selected="selected"' or ''
-        return u'<option value="%s"%s>%s</option>' % (
-            escape(option_value), selected_html,
+        if (option_value in selected_choices):
+            selected_html = u' selected="selected"'
+        else:
+            selected_html = ''
+        if (option_value in self.disabled_choices):
+            disabled_html = u' disabled="disabled"'
+        else:
+            disabled_html = ''
+        return u'<option value="%s"%s%s>%s</option>' % (
+            escape(option_value), selected_html, disabled_html,
             conditional_escape(force_unicode(option_label)))
 
     def render_options(self, choices, selected_choices):
