123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- ===========================================
- PostgreSQL specific form fields and widgets
- ===========================================
- All of these fields and widgets are available from the
- ``django.contrib.postgres.forms`` module.
- .. currentmodule:: django.contrib.postgres.forms
- Fields
- ======
- ``SimpleArrayField``
- --------------------
- .. class:: SimpleArrayField(base_field, delimiter=',', max_length=None, min_length=None)
- A field which maps to an array. It is represented by an HTML ``<input>``.
- .. attribute:: base_field
- This is a required argument.
- It specifies the underlying form field for the array. This is not used
- to render any HTML, but it is used to process the submitted data and
- validate it. For example:
- .. code-block:: pycon
- >>> 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
- .. attribute:: delimiter
- This is an optional argument which defaults to a comma: ``,``. This
- value is used to split the submitted data. It allows you to chain
- ``SimpleArrayField`` for multidimensional data:
- .. code-block:: pycon
- >>> 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::
- The field does not support escaping of the delimiter, so be careful
- in cases where the delimiter is a valid character in the underlying
- field. The delimiter does not need to be only one character.
- .. attribute:: max_length
- This is an optional argument which validates that the array does not
- exceed the stated length.
- .. attribute:: min_length
- This is an optional argument which validates that the array reaches at
- least the stated length.
- .. admonition:: User friendly forms
- ``SimpleArrayField`` is not particularly user friendly in most cases,
- however it is a useful way to format data from a client-side widget for
- submission to the server.
- ``SplitArrayField``
- -------------------
- .. class:: SplitArrayField(base_field, size, remove_trailing_nulls=False)
- This field handles arrays by reproducing the underlying field a fixed
- number of times.
- .. attribute:: base_field
- This is a required argument. It specifies the form field to be
- repeated.
- .. attribute:: size
- This is the fixed number of times the underlying field will be used.
- .. attribute:: remove_trailing_nulls
- By default, this is set to ``False``. When ``False``, each value from
- the repeated fields is stored. When set to ``True``, any trailing
- values which are blank will be stripped from the result. If the
- underlying field has ``required=True``, but ``remove_trailing_nulls``
- is ``True``, then null values are only allowed at the end, and will be
- stripped.
- Some examples::
- 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
- A field which accepts JSON encoded data for an
- :class:`~django.contrib.postgres.fields.HStoreField`. It casts all values
- (except nulls) to strings. It is represented by an HTML ``<textarea>``.
- .. admonition:: User friendly forms
- ``HStoreField`` is not particularly user friendly in most cases,
- however it is a useful way to format data from a client-side widget for
- submission to the server.
- .. note::
- On occasions it may be useful to require or restrict the keys which are
- valid for a given field. This can be done using the
- :class:`~django.contrib.postgres.validators.KeysValidator`.
- Range Fields
- ------------
- This group of fields all share similar functionality for accepting range data.
- They are based on :class:`~django.forms.MultiValueField`. They treat one
- omitted value as an unbounded range. They also validate that the lower bound is
- not greater than the upper bound. All of these fields use
- :class:`~django.contrib.postgres.forms.RangeWidget`.
- ``IntegerRangeField``
- ~~~~~~~~~~~~~~~~~~~~~
- .. class:: IntegerRangeField
- Based on :class:`~django.forms.IntegerField` and translates its input into
- ``django.db.backends.postgresql.psycopg_any.NumericRange``. Default for
- :class:`~django.contrib.postgres.fields.IntegerRangeField` and
- :class:`~django.contrib.postgres.fields.BigIntegerRangeField`.
- ``DecimalRangeField``
- ~~~~~~~~~~~~~~~~~~~~~
- .. class:: DecimalRangeField
- Based on :class:`~django.forms.DecimalField` and translates its input into
- ``django.db.backends.postgresql.psycopg_any.NumericRange``. Default for
- :class:`~django.contrib.postgres.fields.DecimalRangeField`.
- ``DateTimeRangeField``
- ~~~~~~~~~~~~~~~~~~~~~~
- .. class:: DateTimeRangeField
- Based on :class:`~django.forms.DateTimeField` and translates its input into
- ``django.db.backends.postgresql.psycopg_any.DateTimeTZRange``. Default for
- :class:`~django.contrib.postgres.fields.DateTimeRangeField`.
- ``DateRangeField``
- ~~~~~~~~~~~~~~~~~~
- .. class:: DateRangeField
- Based on :class:`~django.forms.DateField` and translates its input into
- ``django.db.backends.postgresql.psycopg_any.DateRange``. Default for
- :class:`~django.contrib.postgres.fields.DateRangeField`.
- Widgets
- =======
- ``RangeWidget``
- ---------------
- .. class:: RangeWidget(base_widget, attrs=None)
- Widget used by all of the range fields.
- Based on :class:`~django.forms.MultiWidget`.
- :class:`~RangeWidget` has one required argument:
- .. attribute:: base_widget
- A :class:`~RangeWidget` comprises a 2-tuple of ``base_widget``.
- .. method:: decompress(value)
- Takes a single "compressed" value of a field, for example a
- :class:`~django.contrib.postgres.fields.DateRangeField`,
- and returns a tuple representing a lower and upper bound.
|