Поля и виджеты форм, специфичные для 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]]}

Примечание

Поле не поддерживает экранирование разделителя, поэтому будьте осторожны в случаях, когда разделитель является допустимым символом в базовом поле. Разделитель не обязательно должен быть только одним символом.

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

Поле, которое принимает данные в кодировке JSON для HStoreField. Оно преобразует все значения (кроме нулей) в строки. Оно представлено HTML <textarea>.

Удобные для пользователя формы

HStoreField в большинстве случаев не особенно удобен для пользователя, однако это полезный способ форматирования данных из виджета на стороне клиента для отправки на сервер.

Примечание

В некоторых случаях может быть полезно потребовать или ограничить ключи, которые действительны для данного поля. Это можно сделать с помощью функции 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 включает в себя 2 кортежа base_widget.

decompress(value)

Принимает одно «сжатое» значение поля, например DateRangeField, и возвращает кортеж, представляющий нижнюю и верхнюю границы.

Вернуться на верх