Index: ../django/forms/extras/widgets.py
===================================================================
--- ../django/forms/extras/widgets.py	(revision 12776)
+++ ../django/forms/extras/widgets.py	(working copy)
@@ -13,14 +13,15 @@
 
 __all__ = ('SelectDateWidget',)
 
-RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$')
-
 class SelectDateWidget(Widget):
     """
     A Widget that splits date input into three <select> boxes.
 
     This also serves as an example of a Widget that has more than one HTML
     element and hence implements value_from_datadict.
+    
+    If format localization is used (USE_L10N = True), combination of %Y, %m and %d directives in default
+    input format is needed for invalid dates to be rendered. 
     """
     none_value = (0, '---')
     month_field = '%s_month'
@@ -36,17 +37,31 @@
         else:
             this_year = datetime.date.today().year
             self.years = range(this_year, this_year+10)
-
+            
     def render(self, name, value, attrs=None):
         try:
             year_val, month_val, day_val = value.year, value.month, value.day
         except AttributeError:
             year_val = month_val = day_val = None
             if isinstance(value, basestring):
-                match = RE_DATE.match(value)
-                if match:
-                    year_val, month_val, day_val = [int(v) for v in match.groups()]
-
+                input_format = get_format('DATE_INPUT_FORMATS')[0] 
+                try: 
+                    val = datetime.datetime.strptime(value, input_format) 
+                    year_val, month_val, day_val = val.year, val.month, val.day 
+                except ValueError:
+                    # When selected day is invalid in month convert input format to regex and receive year, day, month values
+                    # so the failed date still can be rendered. 
+                    format_to_re_dic = {
+                    	'%Y': r'(?P<y>\d+)?',
+                    	'%m': r'(?P<m>\d+?)?',
+                    	'%d': r'(?P<d>\d+?)?'
+                    }
+                    re_str = input_format
+                    for k, v in format_to_re_dic.iteritems():
+                    	re_str = re_str.replace(k, v)                  
+                    match = re.match('^' + re_str + '$', value)
+                    if match:
+                        year_val, month_val, day_val = int(match.group('y')), int(match.group('m')), int(match.group('d'))
         choices = [(i, i) for i in self.years]
         year_html = self.create_select(name, self.year_field, value, year_val, choices)
         choices = MONTHS.items()
@@ -81,16 +96,8 @@
         if y == m == d == "0":
             return None
         if y and m and d:
-            if settings.USE_L10N:
-                input_format = get_format('DATE_INPUT_FORMATS')[0]
-                try:
-                    date_value = datetime.date(int(y), int(m), int(d))
-                except ValueError:
-                    pass
-                else:
-                    return date_value.strftime(input_format)
-            else:
-                return '%s-%s-%s' % (y, m, d)
+            input_format = get_format('DATE_INPUT_FORMATS')[0]
+            return input_format.replace('%Y', y).replace('%m', m).replace('%d', d)
         return data.get(name, None)
 
     def create_select(self, name, field, value, val, choices):
@@ -98,8 +105,7 @@
             id_ = self.attrs['id']
         else:
             id_ = 'id_%s' % name
-        if not (self.required and value):
-            choices.insert(0, self.none_value)
+        choices.insert(0, self.none_value)
         local_attrs = self.build_attrs(id=field % id_)
         s = Select(choices=choices)
         select_html = s.render(field % name, val, local_attrs)
Index: ../tests/regressiontests/forms/extra.py
===================================================================
--- ../tests/regressiontests/forms/extra.py	(revision 12776)
+++ ../tests/regressiontests/forms/extra.py	(working copy)
@@ -364,6 +364,32 @@
 2008-04-01
 
 
+USE_L10N tests
+
+>>> from django.utils import  translation 
+>>> translation.activate('nl')
+>>> from django.conf import settings
+>>> settings.USE_L10N=True
+>>> w.value_from_datadict({'date_year': '2010', 'date_month': '8', 'date_day': '13'}, {}, 'date')
+'13-8-2010'
+>>> res = w.render('date', '13-08-2010')
+>>> u'<option value="13" selected="selected">13</option>' in res
+True
+>>> u'<option value="2010" selected="selected">2010</option>' in res
+True
+>>> u'<option value="8" selected="selected">augustus</option>' in res
+True
+>>> w.value_from_datadict({'date_year': '2010', 'date_month': '8', 'date_day': '13'}, {}, 'date')
+'13-8-2010'
+>>> res = w.render('date', '31-2-2010')
+>>> u'<option value="31" selected="selected">31</option>' in res
+True
+>>> u'<option value="2010" selected="selected">2010</option>' in res
+True
+>>> u'<option value="2" selected="selected">februari</option>' in res
+True
+>>> translation.deactivate()
+
 # MultiWidget and MultiValueField #############################################
 # MultiWidgets are widgets composed of other widgets. They are usually
 # combined with MultiValueFields - a field that is composed of other fields.
