Fixed #22137 -- Made Widget.is_hidden a read-only property
Thanks django at patjack.co.uk for the report and the review.
This commit is contained in:
parent
75d0dcbf84
commit
a19f0d0c1e
|
@ -235,7 +235,6 @@ class RelatedFieldWidgetWrapper(forms.Widget):
|
||||||
admin interface.
|
admin interface.
|
||||||
"""
|
"""
|
||||||
def __init__(self, widget, rel, admin_site, can_add_related=None):
|
def __init__(self, widget, rel, admin_site, can_add_related=None):
|
||||||
self.is_hidden = widget.is_hidden
|
|
||||||
self.needs_multipart_form = widget.needs_multipart_form
|
self.needs_multipart_form = widget.needs_multipart_form
|
||||||
self.attrs = widget.attrs
|
self.attrs = widget.attrs
|
||||||
self.choices = widget.choices
|
self.choices = widget.choices
|
||||||
|
@ -256,6 +255,10 @@ class RelatedFieldWidgetWrapper(forms.Widget):
|
||||||
memo[id(self)] = obj
|
memo[id(self)] = obj
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_hidden(self):
|
||||||
|
return self.widget.is_hidden
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def media(self):
|
def media(self):
|
||||||
return self.widget.media
|
return self.widget.media
|
||||||
|
|
|
@ -166,7 +166,6 @@ class SubWidget(object):
|
||||||
|
|
||||||
|
|
||||||
class Widget(six.with_metaclass(MediaDefiningClass)):
|
class Widget(six.with_metaclass(MediaDefiningClass)):
|
||||||
is_hidden = False # Determines whether this corresponds to an <input type="hidden">.
|
|
||||||
needs_multipart_form = False # Determines does this widget need multipart form
|
needs_multipart_form = False # Determines does this widget need multipart form
|
||||||
is_localized = False
|
is_localized = False
|
||||||
is_required = False
|
is_required = False
|
||||||
|
@ -183,6 +182,18 @@ class Widget(six.with_metaclass(MediaDefiningClass)):
|
||||||
memo[id(self)] = obj
|
memo[id(self)] = obj
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_hidden(self):
|
||||||
|
return self.input_type == 'hidden' if hasattr(self, 'input_type') else False
|
||||||
|
|
||||||
|
@is_hidden.setter
|
||||||
|
def is_hidden(self, *args):
|
||||||
|
warnings.warn(
|
||||||
|
"`is_hidden` property is now read-only (and checks `input_type`). "
|
||||||
|
"Please update your code.",
|
||||||
|
DeprecationWarning, stacklevel=2
|
||||||
|
)
|
||||||
|
|
||||||
def subwidgets(self, name, value, attrs=None, choices=()):
|
def subwidgets(self, name, value, attrs=None, choices=()):
|
||||||
"""
|
"""
|
||||||
Yields all "subwidgets" of this widget. Used only by RadioSelect to
|
Yields all "subwidgets" of this widget. Used only by RadioSelect to
|
||||||
|
@ -286,7 +297,6 @@ class PasswordInput(TextInput):
|
||||||
|
|
||||||
class HiddenInput(Input):
|
class HiddenInput(Input):
|
||||||
input_type = 'hidden'
|
input_type = 'hidden'
|
||||||
is_hidden = True
|
|
||||||
|
|
||||||
|
|
||||||
class MultipleHiddenInput(HiddenInput):
|
class MultipleHiddenInput(HiddenInput):
|
||||||
|
@ -778,6 +788,10 @@ class MultiWidget(Widget):
|
||||||
self.widgets = [w() if isinstance(w, type) else w for w in widgets]
|
self.widgets = [w() if isinstance(w, type) else w for w in widgets]
|
||||||
super(MultiWidget, self).__init__(attrs)
|
super(MultiWidget, self).__init__(attrs)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_hidden(self):
|
||||||
|
return all(w.is_hidden for w in self.widgets)
|
||||||
|
|
||||||
def render(self, name, value, attrs=None):
|
def render(self, name, value, attrs=None):
|
||||||
if self.is_localized:
|
if self.is_localized:
|
||||||
for widget in self.widgets:
|
for widget in self.widgets:
|
||||||
|
@ -865,10 +879,7 @@ class SplitHiddenDateTimeWidget(SplitDateTimeWidget):
|
||||||
"""
|
"""
|
||||||
A Widget that splits datetime input into two <input type="hidden"> inputs.
|
A Widget that splits datetime input into two <input type="hidden"> inputs.
|
||||||
"""
|
"""
|
||||||
is_hidden = True
|
|
||||||
|
|
||||||
def __init__(self, attrs=None, date_format=None, time_format=None):
|
def __init__(self, attrs=None, date_format=None, time_format=None):
|
||||||
super(SplitHiddenDateTimeWidget, self).__init__(attrs, date_format, time_format)
|
super(SplitHiddenDateTimeWidget, self).__init__(attrs, date_format, time_format)
|
||||||
for widget in self.widgets:
|
for widget in self.widgets:
|
||||||
widget.input_type = 'hidden'
|
widget.input_type = 'hidden'
|
||||||
widget.is_hidden = True
|
|
||||||
|
|
|
@ -1100,6 +1100,9 @@ Miscellaneous
|
||||||
This widget now respects the form field's ``is_required`` attribute like
|
This widget now respects the form field's ``is_required`` attribute like
|
||||||
other widgets.
|
other widgets.
|
||||||
|
|
||||||
|
* ``Widget.is_hidden`` is now a read-only property, getting its value by
|
||||||
|
introspecting the presence of ``input_type == 'hidden'``.
|
||||||
|
|
||||||
* :meth:`~django.db.models.query.QuerySet.select_related` now chains in the
|
* :meth:`~django.db.models.query.QuerySet.select_related` now chains in the
|
||||||
same way as other similar calls like ``prefetch_related``. That is,
|
same way as other similar calls like ``prefetch_related``. That is,
|
||||||
``select_related('foo', 'bar')`` is equivalent to
|
``select_related('foo', 'bar')`` is equivalent to
|
||||||
|
|
Loading…
Reference in New Issue