diff options
| author | Jon Dufresne <jon.dufresne@gmail.com> | 2016-03-28 11:02:04 -0700 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-04-21 19:16:38 -0400 |
| commit | ec6121693f112ae33b653b4364e812722d2eb567 (patch) | |
| tree | b791f1345a114d07657a3d226d1c5ff4b1e3f369 /django | |
| parent | 4d1c229ee5cb210e8b592a8d9c87d4a66864328e (diff) | |
Fixed #22383 -- Added support for HTML5 required attribute on required form fields.
Diffstat (limited to 'django')
| -rw-r--r-- | django/forms/boundfield.py | 2 | ||||
| -rw-r--r-- | django/forms/forms.py | 6 | ||||
| -rw-r--r-- | django/forms/formsets.py | 5 | ||||
| -rw-r--r-- | django/forms/models.py | 8 |
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] |
