summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJon Dufresne <jon.dufresne@gmail.com>2016-03-28 11:02:04 -0700
committerTim Graham <timograham@gmail.com>2016-04-21 19:16:38 -0400
commitec6121693f112ae33b653b4364e812722d2eb567 (patch)
treeb791f1345a114d07657a3d226d1c5ff4b1e3f369 /django
parent4d1c229ee5cb210e8b592a8d9c87d4a66864328e (diff)
Fixed #22383 -- Added support for HTML5 required attribute on required form fields.
Diffstat (limited to 'django')
-rw-r--r--django/forms/boundfield.py2
-rw-r--r--django/forms/forms.py6
-rw-r--r--django/forms/formsets.py5
-rw-r--r--django/forms/models.py8
4 files changed, 17 insertions, 4 deletions
diff --git a/django/forms/boundfield.py b/django/forms/boundfield.py
index 6567c4f08f..4867e72deb 100644
--- a/django/forms/boundfield.py
+++ b/django/forms/boundfield.py
@@ -85,6 +85,8 @@ class BoundField(object):
widget.is_localized = True
attrs = attrs or {}
+ if not widget.is_hidden and self.field.required and self.form.use_required_attribute:
+ attrs['required'] = True
if self.field.disabled:
attrs['disabled'] = True
auto_id = self.auto_id
diff --git a/django/forms/forms.py b/django/forms/forms.py
index ac5cf12425..e2ed1a4ac1 100644
--- a/django/forms/forms.py
+++ b/django/forms/forms.py
@@ -67,10 +67,11 @@ class BaseForm(object):
# class, not to the Form class.
field_order = None
prefix = None
+ use_required_attribute = True
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=None,
- empty_permitted=False, field_order=None):
+ empty_permitted=False, field_order=None, use_required_attribute=None):
self.is_bound = data is not None or files is not None
self.data = data or {}
self.files = files or {}
@@ -93,6 +94,9 @@ class BaseForm(object):
self._bound_fields_cache = {}
self.order_fields(self.field_order if field_order is None else field_order)
+ if use_required_attribute is not None:
+ self.use_required_attribute = use_required_attribute
+
def order_fields(self, field_order):
"""
Rearranges the fields according to field_order.
diff --git a/django/forms/formsets.py b/django/forms/formsets.py
index 6400e4a67f..166a6adaeb 100644
--- a/django/forms/formsets.py
+++ b/django/forms/formsets.py
@@ -161,6 +161,10 @@ class BaseFormSet(object):
'auto_id': self.auto_id,
'prefix': self.add_prefix(i),
'error_class': self.error_class,
+ # Don't render the HTML 'required' attribute as it may cause
+ # incorrect validation for extra, optional, and deleted
+ # forms in the formset.
+ 'use_required_attribute': False,
}
if self.is_bound:
defaults['data'] = self.data
@@ -195,6 +199,7 @@ class BaseFormSet(object):
auto_id=self.auto_id,
prefix=self.add_prefix('__prefix__'),
empty_permitted=True,
+ use_required_attribute=False,
**self.get_form_kwargs(None)
)
self.add_fields(form, None)
diff --git a/django/forms/models.py b/django/forms/models.py
index aac75b54ff..4ed8b746d9 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -278,7 +278,7 @@ class ModelFormMetaclass(DeclarativeFieldsMetaclass):
class BaseModelForm(BaseForm):
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=None,
- empty_permitted=False, instance=None):
+ empty_permitted=False, instance=None, use_required_attribute=None):
opts = self._meta
if opts.model is None:
raise ValueError('ModelForm has no model class specified.')
@@ -296,8 +296,10 @@ class BaseModelForm(BaseForm):
# It is False by default so overriding self.clean() and failing to call
# super will stop validate_unique from being called.
self._validate_unique = False
- super(BaseModelForm, self).__init__(data, files, auto_id, prefix, object_data,
- error_class, label_suffix, empty_permitted)
+ super(BaseModelForm, self).__init__(
+ data, files, auto_id, prefix, object_data, error_class,
+ label_suffix, empty_permitted, use_required_attribute=use_required_attribute,
+ )
# Apply ``limit_choices_to`` to each field.
for field_name in self.fields:
formfield = self.fields[field_name]