summaryrefslogtreecommitdiff
path: root/django/contrib/postgres/forms
diff options
context:
space:
mode:
Diffstat (limited to 'django/contrib/postgres/forms')
-rw-r--r--django/contrib/postgres/forms/array.py99
-rw-r--r--django/contrib/postgres/forms/hstore.py15
-rw-r--r--django/contrib/postgres/forms/ranges.py51
3 files changed, 97 insertions, 68 deletions
diff --git a/django/contrib/postgres/forms/array.py b/django/contrib/postgres/forms/array.py
index 2e19cd574a..ddb022afc3 100644
--- a/django/contrib/postgres/forms/array.py
+++ b/django/contrib/postgres/forms/array.py
@@ -3,7 +3,8 @@ from itertools import chain
from django import forms
from django.contrib.postgres.validators import (
- ArrayMaxLengthValidator, ArrayMinLengthValidator,
+ ArrayMaxLengthValidator,
+ ArrayMinLengthValidator,
)
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
@@ -13,10 +14,12 @@ from ..utils import prefix_validation_error
class SimpleArrayField(forms.CharField):
default_error_messages = {
- 'item_invalid': _('Item %(nth)s in the array did not validate:'),
+ "item_invalid": _("Item %(nth)s in the array did not validate:"),
}
- def __init__(self, base_field, *, delimiter=',', max_length=None, min_length=None, **kwargs):
+ def __init__(
+ self, base_field, *, delimiter=",", max_length=None, min_length=None, **kwargs
+ ):
self.base_field = base_field
self.delimiter = delimiter
super().__init__(**kwargs)
@@ -33,7 +36,9 @@ class SimpleArrayField(forms.CharField):
def prepare_value(self, value):
if isinstance(value, list):
- return self.delimiter.join(str(self.base_field.prepare_value(v)) for v in value)
+ return self.delimiter.join(
+ str(self.base_field.prepare_value(v)) for v in value
+ )
return value
def to_python(self, value):
@@ -49,12 +54,14 @@ class SimpleArrayField(forms.CharField):
try:
values.append(self.base_field.to_python(item))
except ValidationError as error:
- errors.append(prefix_validation_error(
- error,
- prefix=self.error_messages['item_invalid'],
- code='item_invalid',
- params={'nth': index + 1},
- ))
+ errors.append(
+ prefix_validation_error(
+ error,
+ prefix=self.error_messages["item_invalid"],
+ code="item_invalid",
+ params={"nth": index + 1},
+ )
+ )
if errors:
raise ValidationError(errors)
return values
@@ -66,12 +73,14 @@ class SimpleArrayField(forms.CharField):
try:
self.base_field.validate(item)
except ValidationError as error:
- errors.append(prefix_validation_error(
- error,
- prefix=self.error_messages['item_invalid'],
- code='item_invalid',
- params={'nth': index + 1},
- ))
+ errors.append(
+ prefix_validation_error(
+ error,
+ prefix=self.error_messages["item_invalid"],
+ code="item_invalid",
+ params={"nth": index + 1},
+ )
+ )
if errors:
raise ValidationError(errors)
@@ -82,12 +91,14 @@ class SimpleArrayField(forms.CharField):
try:
self.base_field.run_validators(item)
except ValidationError as error:
- errors.append(prefix_validation_error(
- error,
- prefix=self.error_messages['item_invalid'],
- code='item_invalid',
- params={'nth': index + 1},
- ))
+ errors.append(
+ prefix_validation_error(
+ error,
+ prefix=self.error_messages["item_invalid"],
+ code="item_invalid",
+ params={"nth": index + 1},
+ )
+ )
if errors:
raise ValidationError(errors)
@@ -103,7 +114,7 @@ class SimpleArrayField(forms.CharField):
class SplitArrayWidget(forms.Widget):
- template_name = 'postgres/widgets/split_array.html'
+ template_name = "postgres/widgets/split_array.html"
def __init__(self, widget, size, **kwargs):
self.widget = widget() if isinstance(widget, type) else widget
@@ -115,19 +126,21 @@ class SplitArrayWidget(forms.Widget):
return self.widget.is_hidden
def value_from_datadict(self, data, files, name):
- return [self.widget.value_from_datadict(data, files, '%s_%s' % (name, index))
- for index in range(self.size)]
+ return [
+ self.widget.value_from_datadict(data, files, "%s_%s" % (name, index))
+ for index in range(self.size)
+ ]
def value_omitted_from_data(self, data, files, name):
return all(
- self.widget.value_omitted_from_data(data, files, '%s_%s' % (name, index))
+ self.widget.value_omitted_from_data(data, files, "%s_%s" % (name, index))
for index in range(self.size)
)
def id_for_label(self, id_):
# See the comment for RadioSelect.id_for_label()
if id_:
- id_ += '_0'
+ id_ += "_0"
return id_
def get_context(self, name, value, attrs=None):
@@ -136,18 +149,20 @@ class SplitArrayWidget(forms.Widget):
if self.is_localized:
self.widget.is_localized = self.is_localized
value = value or []
- context['widget']['subwidgets'] = []
+ context["widget"]["subwidgets"] = []
final_attrs = self.build_attrs(attrs)
- id_ = final_attrs.get('id')
+ id_ = final_attrs.get("id")
for i in range(max(len(value), self.size)):
try:
widget_value = value[i]
except IndexError:
widget_value = None
if id_:
- final_attrs = {**final_attrs, 'id': '%s_%s' % (id_, i)}
- context['widget']['subwidgets'].append(
- self.widget.get_context(name + '_%s' % i, widget_value, final_attrs)['widget']
+ final_attrs = {**final_attrs, "id": "%s_%s" % (id_, i)}
+ context["widget"]["subwidgets"].append(
+ self.widget.get_context(name + "_%s" % i, widget_value, final_attrs)[
+ "widget"
+ ]
)
return context
@@ -167,7 +182,7 @@ class SplitArrayWidget(forms.Widget):
class SplitArrayField(forms.Field):
default_error_messages = {
- 'item_invalid': _('Item %(nth)s in the array did not validate:'),
+ "item_invalid": _("Item %(nth)s in the array did not validate:"),
}
def __init__(self, base_field, size, *, remove_trailing_nulls=False, **kwargs):
@@ -175,7 +190,7 @@ class SplitArrayField(forms.Field):
self.size = size
self.remove_trailing_nulls = remove_trailing_nulls
widget = SplitArrayWidget(widget=base_field.widget, size=size)
- kwargs.setdefault('widget', widget)
+ kwargs.setdefault("widget", widget)
super().__init__(**kwargs)
def _remove_trailing_nulls(self, values):
@@ -198,19 +213,21 @@ class SplitArrayField(forms.Field):
cleaned_data = []
errors = []
if not any(value) and self.required:
- raise ValidationError(self.error_messages['required'])
+ raise ValidationError(self.error_messages["required"])
max_size = max(self.size, len(value))
for index in range(max_size):
item = value[index]
try:
cleaned_data.append(self.base_field.clean(item))
except ValidationError as error:
- errors.append(prefix_validation_error(
- error,
- self.error_messages['item_invalid'],
- code='item_invalid',
- params={'nth': index + 1},
- ))
+ errors.append(
+ prefix_validation_error(
+ error,
+ self.error_messages["item_invalid"],
+ code="item_invalid",
+ params={"nth": index + 1},
+ )
+ )
cleaned_data.append(None)
else:
errors.append(None)
diff --git a/django/contrib/postgres/forms/hstore.py b/django/contrib/postgres/forms/hstore.py
index f5af8f10e3..6a20f7b729 100644
--- a/django/contrib/postgres/forms/hstore.py
+++ b/django/contrib/postgres/forms/hstore.py
@@ -4,17 +4,18 @@ from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
-__all__ = ['HStoreField']
+__all__ = ["HStoreField"]
class HStoreField(forms.CharField):
"""
A field for HStore data which accepts dictionary JSON input.
"""
+
widget = forms.Textarea
default_error_messages = {
- 'invalid_json': _('Could not load JSON data.'),
- 'invalid_format': _('Input must be a JSON dictionary.'),
+ "invalid_json": _("Could not load JSON data."),
+ "invalid_format": _("Input must be a JSON dictionary."),
}
def prepare_value(self, value):
@@ -30,14 +31,14 @@ class HStoreField(forms.CharField):
value = json.loads(value)
except json.JSONDecodeError:
raise ValidationError(
- self.error_messages['invalid_json'],
- code='invalid_json',
+ self.error_messages["invalid_json"],
+ code="invalid_json",
)
if not isinstance(value, dict):
raise ValidationError(
- self.error_messages['invalid_format'],
- code='invalid_format',
+ self.error_messages["invalid_format"],
+ code="invalid_format",
)
# Cast everything to strings for ease.
diff --git a/django/contrib/postgres/forms/ranges.py b/django/contrib/postgres/forms/ranges.py
index 9c673ab40c..444991970d 100644
--- a/django/contrib/postgres/forms/ranges.py
+++ b/django/contrib/postgres/forms/ranges.py
@@ -6,8 +6,13 @@ from django.forms.widgets import HiddenInput, MultiWidget
from django.utils.translation import gettext_lazy as _
__all__ = [
- 'BaseRangeField', 'IntegerRangeField', 'DecimalRangeField',
- 'DateTimeRangeField', 'DateRangeField', 'HiddenRangeWidget', 'RangeWidget',
+ "BaseRangeField",
+ "IntegerRangeField",
+ "DecimalRangeField",
+ "DateTimeRangeField",
+ "DateRangeField",
+ "HiddenRangeWidget",
+ "RangeWidget",
]
@@ -24,27 +29,33 @@ class RangeWidget(MultiWidget):
class HiddenRangeWidget(RangeWidget):
"""A widget that splits input into two <input type="hidden"> inputs."""
+
def __init__(self, attrs=None):
super().__init__(HiddenInput, attrs)
class BaseRangeField(forms.MultiValueField):
default_error_messages = {
- 'invalid': _('Enter two valid values.'),
- 'bound_ordering': _('The start of the range must not exceed the end of the range.'),
+ "invalid": _("Enter two valid values."),
+ "bound_ordering": _(
+ "The start of the range must not exceed the end of the range."
+ ),
}
hidden_widget = HiddenRangeWidget
def __init__(self, **kwargs):
- if 'widget' not in kwargs:
- kwargs['widget'] = RangeWidget(self.base_field.widget)
- if 'fields' not in kwargs:
- kwargs['fields'] = [self.base_field(required=False), self.base_field(required=False)]
- kwargs.setdefault('required', False)
- kwargs.setdefault('require_all_fields', False)
+ if "widget" not in kwargs:
+ kwargs["widget"] = RangeWidget(self.base_field.widget)
+ if "fields" not in kwargs:
+ kwargs["fields"] = [
+ self.base_field(required=False),
+ self.base_field(required=False),
+ ]
+ kwargs.setdefault("required", False)
+ kwargs.setdefault("require_all_fields", False)
self.range_kwargs = {}
- if default_bounds := kwargs.pop('default_bounds', None):
- self.range_kwargs = {'bounds': default_bounds}
+ if default_bounds := kwargs.pop("default_bounds", None):
+ self.range_kwargs = {"bounds": default_bounds}
super().__init__(**kwargs)
def prepare_value(self, value):
@@ -67,39 +78,39 @@ class BaseRangeField(forms.MultiValueField):
lower, upper = values
if lower is not None and upper is not None and lower > upper:
raise exceptions.ValidationError(
- self.error_messages['bound_ordering'],
- code='bound_ordering',
+ self.error_messages["bound_ordering"],
+ code="bound_ordering",
)
try:
range_value = self.range_type(lower, upper, **self.range_kwargs)
except TypeError:
raise exceptions.ValidationError(
- self.error_messages['invalid'],
- code='invalid',
+ self.error_messages["invalid"],
+ code="invalid",
)
else:
return range_value
class IntegerRangeField(BaseRangeField):
- default_error_messages = {'invalid': _('Enter two whole numbers.')}
+ default_error_messages = {"invalid": _("Enter two whole numbers.")}
base_field = forms.IntegerField
range_type = NumericRange
class DecimalRangeField(BaseRangeField):
- default_error_messages = {'invalid': _('Enter two numbers.')}
+ default_error_messages = {"invalid": _("Enter two numbers.")}
base_field = forms.DecimalField
range_type = NumericRange
class DateTimeRangeField(BaseRangeField):
- default_error_messages = {'invalid': _('Enter two valid date/times.')}
+ default_error_messages = {"invalid": _("Enter two valid date/times.")}
base_field = forms.DateTimeField
range_type = DateTimeTZRange
class DateRangeField(BaseRangeField):
- default_error_messages = {'invalid': _('Enter two valid dates.')}
+ default_error_messages = {"invalid": _("Enter two valid dates.")}
base_field = forms.DateField
range_type = DateRange