mirror of
https://github.com/django/django.git
synced 2025-10-28 16:16:12 +00:00
Fixed #22383 -- Added support for HTML5 required attribute on required form fields.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user