# Django 5.2.8 documentation

# PostgreSQL 特有表单字段和部件

所有这些字段和部件都可以从 `django.contrib.postgres.forms` 模块中获得。

## 字段

### `SimpleArrayField`

class SimpleArrayField(base_field, delimiter=',', max_length=None, min_length=None)

  一个映射到数组的字段。它由一个 HTML `<input>` 表示。

  base_field

    这是一个必要的参数。

    它指定了数组的基础表单字段。这不用于呈现任何 HTML，但用于处理提交的数据并验证它。例如：

        >>> from django import forms
        >>> from django.contrib.postgres.forms import SimpleArrayField

        >>> class NumberListForm(forms.Form):
        ...     numbers = SimpleArrayField(forms.IntegerField())
        ...

        >>> form = NumberListForm({"numbers": "1,2,3"})
        >>> form.is_valid()
        True
        >>> form.cleaned_data
        {'numbers': [1, 2, 3]}

        >>> form = NumberListForm({"numbers": "1,2,a"})
        >>> form.is_valid()
        False

  delimiter

    这是一个可选参数，默认为逗号：`,`。这个值用于分隔提交的数据。它允许你链式使用 `SimpleArrayField` 来处理多维数据：

        >>> from django import forms
        >>> from django.contrib.postgres.forms import SimpleArrayField

        >>> class GridForm(forms.Form):
        ...     places = SimpleArrayField(SimpleArrayField(IntegerField()), delimiter="|")
        ...

        >>> form = GridForm({"places": "1,2|2,1|4,3"})
        >>> form.is_valid()
        True
        >>> form.cleaned_data
        {'places': [[1, 2], [2, 1], [4, 3]]}

    Note

    该字段不支持定界符的转义，所以当定界符是底层字段中的有效字符时，要小心。定界符不需要只用一个字符。

  max_length

    这是一个可选的参数，用于验证数组的长度是否超过了规定的长度。

  min_length

    这是一个可选的参数，用于验证数组是否至少达到了指定的长度。

  用户友好的表单

  `SimpleArrayField` 在大多数情况下并不是特别方便用户使用，但是它是一种有用的方式来格式化来自客户端部件的数据以提交给服务器。

### `SplitArrayField`

class SplitArrayField(base_field, size, remove_trailing_nulls=False)

  这个字段通过重现底层字段固定的次数来处理数组。

  base_field

    这是一个必要的参数。它指定了要重复的表单字段。

  size

    这是基础字段的固定使用次数。

  remove_trailing_nulls

    默认情况下，这被设置为 `False`。当 `False` 时，重复字段的每个值都会被存储。当设置为 `True` 时，任何尾部为空白的值将从结果中删除。如果底层字段有 `required=True`，但 `remove_trailing_nulls` 是 `True`，那么只有在最后才允许有空值，并且空值会被消除。

    一些例子：

        SplitArrayField(IntegerField(required=True), size=3, remove_trailing_nulls=False)

        ["1", "2", "3"]  # -> [1, 2, 3]
        ["1", "2", ""]  # -> ValidationError - third entry required.
        ["1", "", "3"]  # -> ValidationError - second entry required.
        ["", "2", ""]  # -> ValidationError - first and third entries required.

        SplitArrayField(IntegerField(required=False), size=3, remove_trailing_nulls=False)

        ["1", "2", "3"]  # -> [1, 2, 3]
        ["1", "2", ""]  # -> [1, 2, None]
        ["1", "", "3"]  # -> [1, None, 3]
        ["", "2", ""]  # -> [None, 2, None]

        SplitArrayField(IntegerField(required=True), size=3, remove_trailing_nulls=True)

        ["1", "2", "3"]  # -> [1, 2, 3]
        ["1", "2", ""]  # -> [1, 2]
        ["1", "", "3"]  # -> ValidationError - second entry required.
        ["", "2", ""]  # -> ValidationError - first entry required.

        SplitArrayField(IntegerField(required=False), size=3, remove_trailing_nulls=True)

        ["1", "2", "3"]  # -> [1, 2, 3]
        ["1", "2", ""]  # -> [1, 2]
        ["1", "", "3"]  # -> [1, None, 3]
        ["", "2", ""]  # -> [None, 2]

### `HStoreField`

class HStoreField

  一个为 `HStoreField` 接受 JSON 编码数据的字段。它将所有的值（除了空值）转换为字符串。它由一个 HTML `<textarea>` 表示。

  用户友好的表单

  `HStoreField` 在大多数情况下对用户不是特别友好，但是它是一种有用的方式来格式化来自客户端部件的数据以提交给服务器。

  Note

  在某些情况下，可能需要要求或限制对某个字段有效的键。这可以使用 `KeysValidator` 来完成。

### 范围字段

这组字段在接受范围数据方面都有类似的功能。它们基于 `MultiValueField`。它们将一个省略的值视为一个无边界的范围。它们还验证了下限不大于上限。所有这些字段都使用 `RangeWidget`。

#### `IntegerRangeField`

class IntegerRangeField

  基于 `IntegerField` 并将其输入翻译为 `django.db.backends.postgresql.psycopg_any.NumericRange`。对于 `IntegerRangeField` 和 `BigIntegerRangeField` 的默认值。

#### `DecimalRangeField`

class DecimalRangeField

  基于 `DecimalField` 并将其输入翻译为 `django.db.backends.postgresql.psycopg_any.NumericRange`。对于 `DecimalRangeField` 的默认值。

#### `DateTimeRangeField`

class DateTimeRangeField

  基于 `DateTimeField` 并将其输入翻译为 `django.db.backends.postgresql.psycopg_any.DateTimeTZRange`。对于 `DateTimeRangeField` 的默认值。

#### `DateRangeField`

class DateRangeField

  基于 `DateField` 并将其输入翻译为 `django.db.backends.postgresql.psycopg_any.DateRange`。对于 `DateRangeField` 的默认值。

## 部件

### `RangeWidget`

class RangeWidget(base_widget, attrs=None)

  所有范围字段都使用的部件。基于 `MultiWidget`。

  `RangeWidget` 有一个必要的参数：

  base_widget

    一个 `RangeWidget` 由 `base_widget` 的二元元组组成。

  decompress(value)

    取一个字段的单个“压缩”值，例如一个 `DateRangeField`，并返回一个元组，代表一个下界和上界。