Skip to content

Commit

Permalink
Fixed #29056 -- Fixed HTML5 validation of required SelectDateWidget.
Browse files Browse the repository at this point in the history
placeholder is required for "select" with "required" attribute.
  • Loading branch information
hramezani authored and felixxm committed May 8, 2019
1 parent 34f589b commit 1a9ec7f
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 3 deletions.
18 changes: 15 additions & 3 deletions django/forms/widgets.py
Expand Up @@ -979,7 +979,11 @@ def get_context(self, name, value, attrs):
date_context['year'] = self.select_widget(attrs, choices=year_choices).get_context(
name=year_name,
value=context['widget']['value']['year'],
attrs={**context['widget']['attrs'], 'id': 'id_%s' % year_name},
attrs={
**context['widget']['attrs'],
'id': 'id_%s' % year_name,
'placeholder': _('Year') if self.is_required else False,
},
)
month_choices = list(self.months.items())
if not self.is_required:
Expand All @@ -988,7 +992,11 @@ def get_context(self, name, value, attrs):
date_context['month'] = self.select_widget(attrs, choices=month_choices).get_context(
name=month_name,
value=context['widget']['value']['month'],
attrs={**context['widget']['attrs'], 'id': 'id_%s' % month_name},
attrs={
**context['widget']['attrs'],
'id': 'id_%s' % month_name,
'placeholder': _('Month') if self.is_required else False,
},
)
day_choices = [(i, i) for i in range(1, 32)]
if not self.is_required:
Expand All @@ -997,7 +1005,11 @@ def get_context(self, name, value, attrs):
date_context['day'] = self.select_widget(attrs, choices=day_choices,).get_context(
name=day_name,
value=context['widget']['value']['day'],
attrs={**context['widget']['attrs'], 'id': 'id_%s' % day_name},
attrs={
**context['widget']['attrs'],
'id': 'id_%s' % day_name,
'placeholder': _('Day') if self.is_required else False,
},
)
subwidgets = []
for field in self._parse_date_fmt():
Expand Down
4 changes: 4 additions & 0 deletions docs/releases/3.0.txt
Expand Up @@ -373,6 +373,10 @@ Miscellaneous

* Support for ``pywatchman`` < 1.2.0 is removed.

* HTML rendered by :class:`~django.forms.SelectDateWidget` for required fields
now have the ``placeholder`` attribute, which mainly may require some
adjustments in tests that compare HTML.

.. _deprecated-features-3.0:

Features deprecated in 3.0
Expand Down
40 changes: 40 additions & 0 deletions tests/forms_tests/widget_tests/test_selectdatewidget.py
Expand Up @@ -314,6 +314,46 @@ class GetRequiredDate(Form):
self.assertFalse(GetNotRequiredDate().fields['mydate'].widget.is_required)
self.assertTrue(GetRequiredDate().fields['mydate'].widget.is_required)

def test_selectdate_required_placeholder(self):
for required in (True, False):
field = DateField(widget=SelectDateWidget(years=('2018', '2019')), required=required)
self.check_html(field.widget, 'my_date', '', html=(
"""
<select name="my_date_month" id="id_my_date_month" %(m_placeholder)s>
%(empty)s
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="my_date_day" id="id_my_date_day" %(d_placeholder)s>
%(empty)s
%(days_options)s
</select>
<select name="my_date_year" id="id_my_date_year" %(y_placeholder)s>
%(empty)s
<option value="2018">2018</option>
<option value="2019">2019</option>
</select>
""" % {
'days_options': '\n'.join(
'<option value="%s">%s</option>' % (i, i) for i in range(1, 32)
),
'm_placeholder': 'placeholder="Month"' if required else '',
'd_placeholder': 'placeholder="Day"' if required else '',
'y_placeholder': 'placeholder="Year"' if required else '',
'empty': '' if required else '<option selected value="">---</option>',
}
))

def test_selectdate_empty_label(self):
w = SelectDateWidget(years=('2014',), empty_label='empty_label')

Expand Down

0 comments on commit 1a9ec7f

Please sign in to comment.