1482 lines
53 KiB
Plaintext
1482 lines
53 KiB
Plaintext
===========
|
|
Form fields
|
|
===========
|
|
|
|
.. module:: django.forms.fields
|
|
:synopsis: Django's built-in form fields.
|
|
|
|
.. currentmodule:: django.forms
|
|
|
|
.. class:: Field(**kwargs)
|
|
|
|
When you create a ``Form`` class, the most important part is defining the
|
|
fields of the form. Each field has custom validation logic, along with a few
|
|
other hooks.
|
|
|
|
.. method:: Field.clean(value)
|
|
|
|
Although the primary way you'll use ``Field`` classes is in ``Form`` classes,
|
|
you can also instantiate them and use them directly to get a better idea of
|
|
how they work. Each ``Field`` instance has a ``clean()`` method, which takes
|
|
a single argument and either raises a
|
|
``django.core.exceptions.ValidationError`` exception or returns the clean
|
|
value::
|
|
|
|
>>> from django import forms
|
|
>>> f = forms.EmailField()
|
|
>>> f.clean('foo@example.com')
|
|
'foo@example.com'
|
|
>>> f.clean('invalid email address')
|
|
Traceback (most recent call last):
|
|
...
|
|
ValidationError: ['Enter a valid email address.']
|
|
|
|
.. _core-field-arguments:
|
|
|
|
Core field arguments
|
|
====================
|
|
|
|
Each ``Field`` class constructor takes at least these arguments. Some
|
|
``Field`` classes take additional, field-specific arguments, but the following
|
|
should *always* be accepted:
|
|
|
|
``required``
|
|
------------
|
|
|
|
.. attribute:: Field.required
|
|
|
|
By default, each ``Field`` class assumes the value is required, so if you pass
|
|
an empty value -- either ``None`` or the empty string (``""``) -- then
|
|
``clean()`` will raise a ``ValidationError`` exception::
|
|
|
|
>>> from django import forms
|
|
>>> f = forms.CharField()
|
|
>>> f.clean('foo')
|
|
'foo'
|
|
>>> f.clean('')
|
|
Traceback (most recent call last):
|
|
...
|
|
ValidationError: ['This field is required.']
|
|
>>> f.clean(None)
|
|
Traceback (most recent call last):
|
|
...
|
|
ValidationError: ['This field is required.']
|
|
>>> f.clean(' ')
|
|
' '
|
|
>>> f.clean(0)
|
|
'0'
|
|
>>> f.clean(True)
|
|
'True'
|
|
>>> f.clean(False)
|
|
'False'
|
|
|
|
To specify that a field is *not* required, pass ``required=False`` to the
|
|
``Field`` constructor::
|
|
|
|
>>> f = forms.CharField(required=False)
|
|
>>> f.clean('foo')
|
|
'foo'
|
|
>>> f.clean('')
|
|
''
|
|
>>> f.clean(None)
|
|
''
|
|
>>> f.clean(0)
|
|
'0'
|
|
>>> f.clean(True)
|
|
'True'
|
|
>>> f.clean(False)
|
|
'False'
|
|
|
|
If a ``Field`` has ``required=False`` and you pass ``clean()`` an empty value,
|
|
then ``clean()`` will return a *normalized* empty value rather than raising
|
|
``ValidationError``. For ``CharField``, this will return
|
|
:attr:`~CharField.empty_value` which defaults to an empty string. For other
|
|
``Field`` classes, it might be ``None``. (This varies from field to field.)
|
|
|
|
Widgets of required form fields have the ``required`` HTML attribute. Set the
|
|
:attr:`Form.use_required_attribute` attribute to ``False`` to disable it. The
|
|
``required`` attribute isn't included on forms of formsets because the browser
|
|
validation may not be correct when adding and deleting formsets.
|
|
|
|
``label``
|
|
---------
|
|
|
|
.. attribute:: Field.label
|
|
|
|
The ``label`` argument lets you specify the "human-friendly" label for this
|
|
field. This is used when the ``Field`` is displayed in a ``Form``.
|
|
|
|
As explained in "Outputting forms as HTML" above, the default label for a
|
|
``Field`` is generated from the field name by converting all underscores to
|
|
spaces and upper-casing the first letter. Specify ``label`` if that default
|
|
behavior doesn't result in an adequate label.
|
|
|
|
Here's a full example ``Form`` that implements ``label`` for two of its fields.
|
|
We've specified ``auto_id=False`` to simplify the output::
|
|
|
|
>>> from django import forms
|
|
>>> class CommentForm(forms.Form):
|
|
... name = forms.CharField(label='Your name')
|
|
... url = forms.URLField(label='Your website', required=False)
|
|
... comment = forms.CharField()
|
|
>>> f = CommentForm(auto_id=False)
|
|
>>> print(f)
|
|
<tr><th>Your name:</th><td><input type="text" name="name" required></td></tr>
|
|
<tr><th>Your website:</th><td><input type="url" name="url"></td></tr>
|
|
<tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>
|
|
|
|
``label_suffix``
|
|
----------------
|
|
|
|
.. attribute:: Field.label_suffix
|
|
|
|
The ``label_suffix`` argument lets you override the form's
|
|
:attr:`~django.forms.Form.label_suffix` on a per-field basis::
|
|
|
|
>>> class ContactForm(forms.Form):
|
|
... age = forms.IntegerField()
|
|
... nationality = forms.CharField()
|
|
... captcha_answer = forms.IntegerField(label='2 + 2', label_suffix=' =')
|
|
>>> f = ContactForm(label_suffix='?')
|
|
>>> print(f.as_p())
|
|
<p><label for="id_age">Age?</label> <input id="id_age" name="age" type="number" required></p>
|
|
<p><label for="id_nationality">Nationality?</label> <input id="id_nationality" name="nationality" type="text" required></p>
|
|
<p><label for="id_captcha_answer">2 + 2 =</label> <input id="id_captcha_answer" name="captcha_answer" type="number" required></p>
|
|
|
|
``initial``
|
|
-----------
|
|
|
|
.. attribute:: Field.initial
|
|
|
|
The ``initial`` argument lets you specify the initial value to use when
|
|
rendering this ``Field`` in an unbound ``Form``.
|
|
|
|
To specify dynamic initial data, see the :attr:`Form.initial` parameter.
|
|
|
|
The use-case for this is when you want to display an "empty" form in which a
|
|
field is initialized to a particular value. For example::
|
|
|
|
>>> from django import forms
|
|
>>> class CommentForm(forms.Form):
|
|
... name = forms.CharField(initial='Your name')
|
|
... url = forms.URLField(initial='http://')
|
|
... comment = forms.CharField()
|
|
>>> f = CommentForm(auto_id=False)
|
|
>>> print(f)
|
|
<tr><th>Name:</th><td><input type="text" name="name" value="Your name" required></td></tr>
|
|
<tr><th>Url:</th><td><input type="url" name="url" value="http://" required></td></tr>
|
|
<tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>
|
|
|
|
You may be thinking, why not just pass a dictionary of the initial values as
|
|
data when displaying the form? Well, if you do that, you'll trigger validation,
|
|
and the HTML output will include any validation errors::
|
|
|
|
>>> class CommentForm(forms.Form):
|
|
... name = forms.CharField()
|
|
... url = forms.URLField()
|
|
... comment = forms.CharField()
|
|
>>> default_data = {'name': 'Your name', 'url': 'http://'}
|
|
>>> f = CommentForm(default_data, auto_id=False)
|
|
>>> print(f)
|
|
<tr><th>Name:</th><td><input type="text" name="name" value="Your name" required></td></tr>
|
|
<tr><th>Url:</th><td><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="url" name="url" value="http://" required></td></tr>
|
|
<tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" required></td></tr>
|
|
|
|
This is why ``initial`` values are only displayed for unbound forms. For bound
|
|
forms, the HTML output will use the bound data.
|
|
|
|
Also note that ``initial`` values are *not* used as "fallback" data in
|
|
validation if a particular field's value is not given. ``initial`` values are
|
|
*only* intended for initial form display::
|
|
|
|
>>> class CommentForm(forms.Form):
|
|
... name = forms.CharField(initial='Your name')
|
|
... url = forms.URLField(initial='http://')
|
|
... comment = forms.CharField()
|
|
>>> data = {'name': '', 'url': '', 'comment': 'Foo'}
|
|
>>> f = CommentForm(data)
|
|
>>> f.is_valid()
|
|
False
|
|
# The form does *not* fall back to using the initial values.
|
|
>>> f.errors
|
|
{'url': ['This field is required.'], 'name': ['This field is required.']}
|
|
|
|
Instead of a constant, you can also pass any callable::
|
|
|
|
>>> import datetime
|
|
>>> class DateForm(forms.Form):
|
|
... day = forms.DateField(initial=datetime.date.today)
|
|
>>> print(DateForm())
|
|
<tr><th>Day:</th><td><input type="text" name="day" value="12/23/2008" required><td></tr>
|
|
|
|
The callable will be evaluated only when the unbound form is displayed, not when it is defined.
|
|
|
|
``widget``
|
|
----------
|
|
|
|
.. attribute:: Field.widget
|
|
|
|
The ``widget`` argument lets you specify a ``Widget`` class to use when
|
|
rendering this ``Field``. See :doc:`/ref/forms/widgets` for more information.
|
|
|
|
``help_text``
|
|
-------------
|
|
|
|
.. attribute:: Field.help_text
|
|
|
|
The ``help_text`` argument lets you specify descriptive text for this
|
|
``Field``. If you provide ``help_text``, it will be displayed next to the
|
|
``Field`` when the ``Field`` is rendered by one of the convenience ``Form``
|
|
methods (e.g., ``as_ul()``).
|
|
|
|
Like the model field's :attr:`~django.db.models.Field.help_text`, this value
|
|
isn't HTML-escaped in automatically-generated forms.
|
|
|
|
Here's a full example ``Form`` that implements ``help_text`` for two of its
|
|
fields. We've specified ``auto_id=False`` to simplify the output::
|
|
|
|
>>> from django import forms
|
|
>>> class HelpTextContactForm(forms.Form):
|
|
... subject = forms.CharField(max_length=100, help_text='100 characters max.')
|
|
... message = forms.CharField()
|
|
... sender = forms.EmailField(help_text='A valid email address, please.')
|
|
... cc_myself = forms.BooleanField(required=False)
|
|
>>> f = HelpTextContactForm(auto_id=False)
|
|
>>> print(f.as_table())
|
|
<tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" required><br><span class="helptext">100 characters max.</span></td></tr>
|
|
<tr><th>Message:</th><td><input type="text" name="message" required></td></tr>
|
|
<tr><th>Sender:</th><td><input type="email" name="sender" required><br>A valid email address, please.</td></tr>
|
|
<tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself"></td></tr>
|
|
>>> print(f.as_ul()))
|
|
<li>Subject: <input type="text" name="subject" maxlength="100" required> <span class="helptext">100 characters max.</span></li>
|
|
<li>Message: <input type="text" name="message" required></li>
|
|
<li>Sender: <input type="email" name="sender" required> A valid email address, please.</li>
|
|
<li>Cc myself: <input type="checkbox" name="cc_myself"></li>
|
|
>>> print(f.as_p())
|
|
<p>Subject: <input type="text" name="subject" maxlength="100" required> <span class="helptext">100 characters max.</span></p>
|
|
<p>Message: <input type="text" name="message" required></p>
|
|
<p>Sender: <input type="email" name="sender" required> A valid email address, please.</p>
|
|
<p>Cc myself: <input type="checkbox" name="cc_myself"></p>
|
|
|
|
``error_messages``
|
|
------------------
|
|
|
|
.. attribute:: Field.error_messages
|
|
|
|
The ``error_messages`` argument lets you override the default messages that the
|
|
field will raise. Pass in a dictionary with keys matching the error messages you
|
|
want to override. For example, here is the default error message::
|
|
|
|
>>> from django import forms
|
|
>>> generic = forms.CharField()
|
|
>>> generic.clean('')
|
|
Traceback (most recent call last):
|
|
...
|
|
ValidationError: ['This field is required.']
|
|
|
|
And here is a custom error message::
|
|
|
|
>>> name = forms.CharField(error_messages={'required': 'Please enter your name'})
|
|
>>> name.clean('')
|
|
Traceback (most recent call last):
|
|
...
|
|
ValidationError: ['Please enter your name']
|
|
|
|
In the `built-in Field classes`_ section below, each ``Field`` defines the
|
|
error message keys it uses.
|
|
|
|
``validators``
|
|
--------------
|
|
|
|
.. attribute:: Field.validators
|
|
|
|
The ``validators`` argument lets you provide a list of validation functions
|
|
for this field.
|
|
|
|
See the :doc:`validators documentation </ref/validators>` for more information.
|
|
|
|
``localize``
|
|
------------
|
|
|
|
.. attribute:: Field.localize
|
|
|
|
The ``localize`` argument enables the localization of form data input, as well
|
|
as the rendered output.
|
|
|
|
See the :doc:`format localization </topics/i18n/formatting>` documentation for
|
|
more information.
|
|
|
|
``disabled``
|
|
------------
|
|
|
|
.. attribute:: Field.disabled
|
|
|
|
The ``disabled`` boolean argument, when set to ``True``, disables a form field
|
|
using the ``disabled`` HTML attribute so that it won't be editable by users.
|
|
Even if a user tampers with the field's value submitted to the server, it will
|
|
be ignored in favor of the value from the form's initial data.
|
|
|
|
Checking if the field data has changed
|
|
======================================
|
|
|
|
``has_changed()``
|
|
-----------------
|
|
|
|
.. method:: Field.has_changed()
|
|
|
|
The ``has_changed()`` method is used to determine if the field value has changed
|
|
from the initial value. Returns ``True`` or ``False``.
|
|
|
|
See the :class:`Form.has_changed()` documentation for more information.
|
|
|
|
.. _built-in-fields:
|
|
|
|
Built-in ``Field`` classes
|
|
==========================
|
|
|
|
Naturally, the ``forms`` library comes with a set of ``Field`` classes that
|
|
represent common validation needs. This section documents each built-in field.
|
|
|
|
For each field, we describe the default widget used if you don't specify
|
|
``widget``. We also specify the value returned when you provide an empty value
|
|
(see the section on ``required`` above to understand what that means).
|
|
|
|
``BooleanField``
|
|
----------------
|
|
|
|
.. class:: BooleanField(**kwargs)
|
|
|
|
* Default widget: :class:`CheckboxInput`
|
|
* Empty value: ``False``
|
|
* Normalizes to: A Python ``True`` or ``False`` value.
|
|
* Validates that the value is ``True`` (e.g. the check box is checked) if
|
|
the field has ``required=True``.
|
|
* Error message keys: ``required``
|
|
|
|
.. note::
|
|
|
|
Since all ``Field`` subclasses have ``required=True`` by default, the
|
|
validation condition here is important. If you want to include a boolean
|
|
in your form that can be either ``True`` or ``False`` (e.g. a checked or
|
|
unchecked checkbox), you must remember to pass in ``required=False`` when
|
|
creating the ``BooleanField``.
|
|
|
|
``CharField``
|
|
-------------
|
|
|
|
.. class:: CharField(**kwargs)
|
|
|
|
* Default widget: :class:`TextInput`
|
|
* Empty value: Whatever you've given as :attr:`empty_value`.
|
|
* Normalizes to: A string.
|
|
* Uses :class:`~django.core.validators.MaxLengthValidator` and
|
|
:class:`~django.core.validators.MinLengthValidator` if ``max_length`` and
|
|
``min_length`` are provided. Otherwise, all inputs are valid.
|
|
* Error message keys: ``required``, ``max_length``, ``min_length``
|
|
|
|
Has four optional arguments for validation:
|
|
|
|
.. attribute:: max_length
|
|
.. attribute:: min_length
|
|
|
|
If provided, these arguments ensure that the string is at most or at
|
|
least the given length.
|
|
|
|
.. attribute:: strip
|
|
|
|
If ``True`` (default), the value will be stripped of leading and
|
|
trailing whitespace.
|
|
|
|
.. attribute:: empty_value
|
|
|
|
The value to use to represent "empty". Defaults to an empty string.
|
|
|
|
``ChoiceField``
|
|
---------------
|
|
|
|
.. class:: ChoiceField(**kwargs)
|
|
|
|
* Default widget: :class:`Select`
|
|
* Empty value: ``''`` (an empty string)
|
|
* Normalizes to: A string.
|
|
* Validates that the given value exists in the list of choices.
|
|
* Error message keys: ``required``, ``invalid_choice``
|
|
|
|
The ``invalid_choice`` error message may contain ``%(value)s``, which will be
|
|
replaced with the selected choice.
|
|
|
|
Takes one extra argument:
|
|
|
|
.. attribute:: choices
|
|
|
|
Either an :term:`iterable` of 2-tuples to use as choices for this
|
|
field, :ref:`enumeration <field-choices-enum-types>` choices, or a
|
|
callable that returns such an iterable. This argument accepts the same
|
|
formats as the ``choices`` argument to a model field. See the
|
|
:ref:`model field reference documentation on choices <field-choices>`
|
|
for more details. If the argument is a callable, it is evaluated each
|
|
time the field's form is initialized, in addition to during rendering.
|
|
Defaults to an empty list.
|
|
|
|
``TypedChoiceField``
|
|
--------------------
|
|
|
|
.. class:: TypedChoiceField(**kwargs)
|
|
|
|
Just like a :class:`ChoiceField`, except :class:`TypedChoiceField` takes two
|
|
extra arguments, :attr:`coerce` and :attr:`empty_value`.
|
|
|
|
* Default widget: :class:`Select`
|
|
* Empty value: Whatever you've given as :attr:`empty_value`.
|
|
* Normalizes to: A value of the type provided by the :attr:`coerce`
|
|
argument.
|
|
* Validates that the given value exists in the list of choices and can be
|
|
coerced.
|
|
* Error message keys: ``required``, ``invalid_choice``
|
|
|
|
Takes extra arguments:
|
|
|
|
.. attribute:: coerce
|
|
|
|
A function that takes one argument and returns a coerced value. Examples
|
|
include the built-in ``int``, ``float``, ``bool`` and other types. Defaults
|
|
to an identity function. Note that coercion happens after input
|
|
validation, so it is possible to coerce to a value not present in
|
|
``choices``.
|
|
|
|
.. attribute:: empty_value
|
|
|
|
The value to use to represent "empty." Defaults to the empty string;
|
|
``None`` is another common choice here. Note that this value will not be
|
|
coerced by the function given in the ``coerce`` argument, so choose it
|
|
accordingly.
|
|
|
|
``DateField``
|
|
-------------
|
|
|
|
.. class:: DateField(**kwargs)
|
|
|
|
* Default widget: :class:`DateInput`
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python ``datetime.date`` object.
|
|
* Validates that the given value is either a ``datetime.date``,
|
|
``datetime.datetime`` or string formatted in a particular date format.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
Takes one optional argument:
|
|
|
|
.. attribute:: input_formats
|
|
|
|
A list of formats used to attempt to convert a string to a valid
|
|
``datetime.date`` object.
|
|
|
|
If no ``input_formats`` argument is provided, the default input formats are
|
|
taken from :setting:`DATE_INPUT_FORMATS` if :setting:`USE_L10N` is
|
|
``False``, or from the active locale format ``DATE_INPUT_FORMATS`` key if
|
|
localization is enabled. See also :doc:`format localization
|
|
</topics/i18n/formatting>`.
|
|
|
|
``DateTimeField``
|
|
-----------------
|
|
|
|
.. class:: DateTimeField(**kwargs)
|
|
|
|
* Default widget: :class:`DateTimeInput`
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python ``datetime.datetime`` object.
|
|
* Validates that the given value is either a ``datetime.datetime``,
|
|
``datetime.date`` or string formatted in a particular datetime format.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
Takes one optional argument:
|
|
|
|
.. attribute:: input_formats
|
|
|
|
A list of formats used to attempt to convert a string to a valid
|
|
``datetime.datetime`` object, in addition to ISO 8601 formats.
|
|
|
|
The field always accepts strings in ISO 8601 formatted dates or similar
|
|
recognized by :func:`~django.utils.dateparse.parse_datetime`. Some examples
|
|
are::
|
|
|
|
* '2006-10-25 14:30:59'
|
|
* '2006-10-25T14:30:59'
|
|
* '2006-10-25 14:30'
|
|
* '2006-10-25T14:30'
|
|
* '2006-10-25T14:30Z'
|
|
* '2006-10-25T14:30+02:00'
|
|
* '2006-10-25'
|
|
|
|
If no ``input_formats`` argument is provided, the default input formats are
|
|
taken from :setting:`DATETIME_INPUT_FORMATS` and
|
|
:setting:`DATE_INPUT_FORMATS` if :setting:`USE_L10N` is ``False``, or from
|
|
the active locale format ``DATETIME_INPUT_FORMATS`` and
|
|
``DATE_INPUT_FORMATS`` keys if localization is enabled. See also
|
|
:doc:`format localization </topics/i18n/formatting>`.
|
|
|
|
``DecimalField``
|
|
----------------
|
|
|
|
.. class:: DecimalField(**kwargs)
|
|
|
|
* Default widget: :class:`NumberInput` when :attr:`Field.localize` is
|
|
``False``, else :class:`TextInput`.
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python ``decimal``.
|
|
* Validates that the given value is a decimal. Uses
|
|
:class:`~django.core.validators.MaxValueValidator` and
|
|
:class:`~django.core.validators.MinValueValidator` if ``max_value`` and
|
|
``min_value`` are provided. Leading and trailing whitespace is ignored.
|
|
* Error message keys: ``required``, ``invalid``, ``max_value``,
|
|
``min_value``, ``max_digits``, ``max_decimal_places``,
|
|
``max_whole_digits``
|
|
|
|
The ``max_value`` and ``min_value`` error messages may contain
|
|
``%(limit_value)s``, which will be substituted by the appropriate limit.
|
|
Similarly, the ``max_digits``, ``max_decimal_places`` and
|
|
``max_whole_digits`` error messages may contain ``%(max)s``.
|
|
|
|
Takes four optional arguments:
|
|
|
|
.. attribute:: max_value
|
|
.. attribute:: min_value
|
|
|
|
These control the range of values permitted in the field, and should be
|
|
given as ``decimal.Decimal`` values.
|
|
|
|
.. attribute:: max_digits
|
|
|
|
The maximum number of digits (those before the decimal point plus those
|
|
after the decimal point, with leading zeros stripped) permitted in the
|
|
value.
|
|
|
|
.. attribute:: decimal_places
|
|
|
|
The maximum number of decimal places permitted.
|
|
|
|
``DurationField``
|
|
-----------------
|
|
|
|
.. class:: DurationField(**kwargs)
|
|
|
|
* Default widget: :class:`TextInput`
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python :class:`~python:datetime.timedelta`.
|
|
* Validates that the given value is a string which can be converted into a
|
|
``timedelta``. The value must be between :attr:`datetime.timedelta.min`
|
|
and :attr:`datetime.timedelta.max`.
|
|
* Error message keys: ``required``, ``invalid``, ``overflow``.
|
|
|
|
Accepts any format understood by
|
|
:func:`~django.utils.dateparse.parse_duration`.
|
|
|
|
``EmailField``
|
|
--------------
|
|
|
|
.. class:: EmailField(**kwargs)
|
|
|
|
* Default widget: :class:`EmailInput`
|
|
* Empty value: Whatever you've given as ``empty_value``.
|
|
* Normalizes to: A string.
|
|
* Uses :class:`~django.core.validators.EmailValidator` to validate that
|
|
the given value is a valid email address, using a moderately complex
|
|
regular expression.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
Has three optional arguments ``max_length``, ``min_length``, and
|
|
``empty_value`` which work just as they do for :class:`CharField`.
|
|
|
|
``FileField``
|
|
-------------
|
|
|
|
.. class:: FileField(**kwargs)
|
|
|
|
* Default widget: :class:`ClearableFileInput`
|
|
* Empty value: ``None``
|
|
* Normalizes to: An ``UploadedFile`` object that wraps the file content
|
|
and file name into a single object.
|
|
* Can validate that non-empty file data has been bound to the form.
|
|
* Error message keys: ``required``, ``invalid``, ``missing``, ``empty``,
|
|
``max_length``
|
|
|
|
Has two optional arguments for validation, ``max_length`` and
|
|
``allow_empty_file``. If provided, these ensure that the file name is at
|
|
most the given length, and that validation will succeed even if the file
|
|
content is empty.
|
|
|
|
To learn more about the ``UploadedFile`` object, see the :doc:`file uploads
|
|
documentation </topics/http/file-uploads>`.
|
|
|
|
When you use a ``FileField`` in a form, you must also remember to
|
|
:ref:`bind the file data to the form <binding-uploaded-files>`.
|
|
|
|
The ``max_length`` error refers to the length of the filename. In the error
|
|
message for that key, ``%(max)d`` will be replaced with the maximum filename
|
|
length and ``%(length)d`` will be replaced with the current filename length.
|
|
|
|
``FilePathField``
|
|
-----------------
|
|
|
|
.. class:: FilePathField(**kwargs)
|
|
|
|
* Default widget: :class:`Select`
|
|
* Empty value: ``''`` (an empty string)
|
|
* Normalizes to: A string.
|
|
* Validates that the selected choice exists in the list of choices.
|
|
* Error message keys: ``required``, ``invalid_choice``
|
|
|
|
The field allows choosing from files inside a certain directory. It takes five
|
|
extra arguments; only ``path`` is required:
|
|
|
|
.. attribute:: path
|
|
|
|
The absolute path to the directory whose contents you want listed. This
|
|
directory must exist.
|
|
|
|
.. attribute:: recursive
|
|
|
|
If ``False`` (the default) only the direct contents of ``path`` will be
|
|
offered as choices. If ``True``, the directory will be descended into
|
|
recursively and all descendants will be listed as choices.
|
|
|
|
.. attribute:: match
|
|
|
|
A regular expression pattern; only files with names matching this expression
|
|
will be allowed as choices.
|
|
|
|
.. attribute:: allow_files
|
|
|
|
Optional. Either ``True`` or ``False``. Default is ``True``. Specifies
|
|
whether files in the specified location should be included. Either this or
|
|
:attr:`allow_folders` must be ``True``.
|
|
|
|
.. attribute:: allow_folders
|
|
|
|
Optional. Either ``True`` or ``False``. Default is ``False``. Specifies
|
|
whether folders in the specified location should be included. Either this or
|
|
:attr:`allow_files` must be ``True``.
|
|
|
|
|
|
``FloatField``
|
|
--------------
|
|
|
|
.. class:: FloatField(**kwargs)
|
|
|
|
* Default widget: :class:`NumberInput` when :attr:`Field.localize` is
|
|
``False``, else :class:`TextInput`.
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python float.
|
|
* Validates that the given value is a float. Uses
|
|
:class:`~django.core.validators.MaxValueValidator` and
|
|
:class:`~django.core.validators.MinValueValidator` if ``max_value`` and
|
|
``min_value`` are provided. Leading and trailing whitespace is allowed,
|
|
as in Python's ``float()`` function.
|
|
* Error message keys: ``required``, ``invalid``, ``max_value``,
|
|
``min_value``
|
|
|
|
Takes two optional arguments for validation, ``max_value`` and ``min_value``.
|
|
These control the range of values permitted in the field.
|
|
|
|
``ImageField``
|
|
--------------
|
|
|
|
.. class:: ImageField(**kwargs)
|
|
|
|
* Default widget: :class:`ClearableFileInput`
|
|
* Empty value: ``None``
|
|
* Normalizes to: An ``UploadedFile`` object that wraps the file content
|
|
and file name into a single object.
|
|
* Validates that file data has been bound to the form. Also uses
|
|
:class:`~django.core.validators.FileExtensionValidator` to validate that
|
|
the file extension is supported by Pillow.
|
|
* Error message keys: ``required``, ``invalid``, ``missing``, ``empty``,
|
|
``invalid_image``
|
|
|
|
Using an ``ImageField`` requires that `Pillow`_ is installed with support
|
|
for the image formats you use. If you encounter a ``corrupt image`` error
|
|
when you upload an image, it usually means that Pillow doesn't understand
|
|
its format. To fix this, install the appropriate library and reinstall
|
|
Pillow.
|
|
|
|
When you use an ``ImageField`` on a form, you must also remember to
|
|
:ref:`bind the file data to the form <binding-uploaded-files>`.
|
|
|
|
After the field has been cleaned and validated, the ``UploadedFile``
|
|
object will have an additional ``image`` attribute containing the Pillow
|
|
`Image`_ instance used to check if the file was a valid image. Pillow
|
|
closes the underlying file descriptor after verifying an image, so while
|
|
non-image data attributes, such as ``format``, ``height``, and ``width``,
|
|
are available, methods that access the underlying image data, such as
|
|
``getdata()`` or ``getpixel()``, cannot be used without reopening the file.
|
|
For example::
|
|
|
|
>>> from PIL import Image
|
|
>>> from django import forms
|
|
>>> from django.core.files.uploadedfile import SimpleUploadedFile
|
|
>>> class ImageForm(forms.Form):
|
|
... img = forms.ImageField()
|
|
>>> file_data = {'img': SimpleUploadedFile('test.png', <file data>)}
|
|
>>> form = ImageForm({}, file_data)
|
|
# Pillow closes the underlying file descriptor.
|
|
>>> form.is_valid()
|
|
True
|
|
>>> image_field = form.cleaned_data['img']
|
|
>>> image_field.image
|
|
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=191x287 at 0x7F5985045C18>
|
|
>>> image_field.image.width
|
|
191
|
|
>>> image_field.image.height
|
|
287
|
|
>>> image_field.image.format
|
|
'PNG'
|
|
>>> image_field.image.getdata()
|
|
# Raises AttributeError: 'NoneType' object has no attribute 'seek'.
|
|
>>> image = Image.open(image_field)
|
|
>>> image.getdata()
|
|
<ImagingCore object at 0x7f5984f874b0>
|
|
|
|
Additionally, ``UploadedFile.content_type`` will be updated with the
|
|
image's content type if Pillow can determine it, otherwise it will be set
|
|
to ``None``.
|
|
|
|
.. _Pillow: https://pillow.readthedocs.io/en/latest/
|
|
.. _Image: https://pillow.readthedocs.io/en/latest/reference/Image.html
|
|
|
|
``IntegerField``
|
|
----------------
|
|
|
|
.. class:: IntegerField(**kwargs)
|
|
|
|
* Default widget: :class:`NumberInput` when :attr:`Field.localize` is
|
|
``False``, else :class:`TextInput`.
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python integer.
|
|
* Validates that the given value is an integer. Uses
|
|
:class:`~django.core.validators.MaxValueValidator` and
|
|
:class:`~django.core.validators.MinValueValidator` if ``max_value`` and
|
|
``min_value`` are provided. Leading and trailing whitespace is allowed,
|
|
as in Python's ``int()`` function.
|
|
* Error message keys: ``required``, ``invalid``, ``max_value``,
|
|
``min_value``
|
|
|
|
The ``max_value`` and ``min_value`` error messages may contain
|
|
``%(limit_value)s``, which will be substituted by the appropriate limit.
|
|
|
|
Takes two optional arguments for validation:
|
|
|
|
.. attribute:: max_value
|
|
.. attribute:: min_value
|
|
|
|
These control the range of values permitted in the field.
|
|
|
|
``JSONField``
|
|
-------------
|
|
|
|
.. class:: JSONField(encoder=None, decoder=None, **kwargs)
|
|
|
|
A field which accepts JSON encoded data for a
|
|
:class:`~django.db.models.JSONField`.
|
|
|
|
* Default widget: :class:`Textarea`
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python representation of the JSON value (usually as a
|
|
``dict``, ``list``, or ``None``), depending on :attr:`JSONField.decoder`.
|
|
* Validates that the given value is a valid JSON.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
Takes two optional arguments:
|
|
|
|
.. attribute:: encoder
|
|
|
|
A :py:class:`json.JSONEncoder` subclass to serialize data types not
|
|
supported by the standard JSON serializer (e.g. ``datetime.datetime``
|
|
or :class:`~python:uuid.UUID`). For example, you can use the
|
|
:class:`~django.core.serializers.json.DjangoJSONEncoder` class.
|
|
|
|
Defaults to ``json.JSONEncoder``.
|
|
|
|
.. attribute:: decoder
|
|
|
|
A :py:class:`json.JSONDecoder` subclass to deserialize the input. Your
|
|
deserialization may need to account for the fact that you can't be
|
|
certain of the input type. For example, you run the risk of returning a
|
|
``datetime`` that was actually a string that just happened to be in the
|
|
same format chosen for ``datetime``\s.
|
|
|
|
The ``decoder`` can be used to validate the input. If
|
|
:py:class:`json.JSONDecodeError` is raised during the deserialization,
|
|
a ``ValidationError`` will be raised.
|
|
|
|
Defaults to ``json.JSONDecoder``.
|
|
|
|
.. note::
|
|
|
|
If you use a :class:`ModelForm <django.forms.ModelForm>`, the
|
|
``encoder`` and ``decoder`` from :class:`~django.db.models.JSONField`
|
|
will be used.
|
|
|
|
.. admonition:: User friendly forms
|
|
|
|
``JSONField`` 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.
|
|
|
|
``GenericIPAddressField``
|
|
-------------------------
|
|
|
|
.. class:: GenericIPAddressField(**kwargs)
|
|
|
|
A field containing either an IPv4 or an IPv6 address.
|
|
|
|
* Default widget: :class:`TextInput`
|
|
* Empty value: ``''`` (an empty string)
|
|
* Normalizes to: A string. IPv6 addresses are normalized as described below.
|
|
* Validates that the given value is a valid IP address.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
The IPv6 address normalization follows :rfc:`4291#section-2.2` section 2.2,
|
|
including using the IPv4 format suggested in paragraph 3 of that section, like
|
|
``::ffff:192.0.2.0``. For example, ``2001:0::0:01`` would be normalized to
|
|
``2001::1``, and ``::ffff:0a0a:0a0a`` to ``::ffff:10.10.10.10``. All characters
|
|
are converted to lowercase.
|
|
|
|
Takes two optional arguments:
|
|
|
|
.. attribute:: protocol
|
|
|
|
Limits valid inputs to the specified protocol.
|
|
Accepted values are ``both`` (default), ``IPv4``
|
|
or ``IPv6``. Matching is case insensitive.
|
|
|
|
.. attribute:: unpack_ipv4
|
|
|
|
Unpacks IPv4 mapped addresses like ``::ffff:192.0.2.1``.
|
|
If this option is enabled that address would be unpacked to
|
|
``192.0.2.1``. Default is disabled. Can only be used
|
|
when ``protocol`` is set to ``'both'``.
|
|
|
|
``MultipleChoiceField``
|
|
-----------------------
|
|
|
|
.. class:: MultipleChoiceField(**kwargs)
|
|
|
|
* Default widget: :class:`SelectMultiple`
|
|
* Empty value: ``[]`` (an empty list)
|
|
* Normalizes to: A list of strings.
|
|
* Validates that every value in the given list of values exists in the list
|
|
of choices.
|
|
* Error message keys: ``required``, ``invalid_choice``, ``invalid_list``
|
|
|
|
The ``invalid_choice`` error message may contain ``%(value)s``, which will be
|
|
replaced with the selected choice.
|
|
|
|
Takes one extra required argument, ``choices``, as for :class:`ChoiceField`.
|
|
|
|
``TypedMultipleChoiceField``
|
|
----------------------------
|
|
|
|
.. class:: TypedMultipleChoiceField(**kwargs)
|
|
|
|
Just like a :class:`MultipleChoiceField`, except :class:`TypedMultipleChoiceField`
|
|
takes two extra arguments, ``coerce`` and ``empty_value``.
|
|
|
|
* Default widget: :class:`SelectMultiple`
|
|
* Empty value: Whatever you've given as ``empty_value``
|
|
* Normalizes to: A list of values of the type provided by the ``coerce``
|
|
argument.
|
|
* Validates that the given values exists in the list of choices and can be
|
|
coerced.
|
|
* Error message keys: ``required``, ``invalid_choice``
|
|
|
|
The ``invalid_choice`` error message may contain ``%(value)s``, which will be
|
|
replaced with the selected choice.
|
|
|
|
Takes two extra arguments, ``coerce`` and ``empty_value``, as for
|
|
:class:`TypedChoiceField`.
|
|
|
|
``NullBooleanField``
|
|
--------------------
|
|
|
|
.. class:: NullBooleanField(**kwargs)
|
|
|
|
* Default widget: :class:`NullBooleanSelect`
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python ``True``, ``False`` or ``None`` value.
|
|
* Validates nothing (i.e., it never raises a ``ValidationError``).
|
|
|
|
``NullBooleanField`` may be used with widgets such as
|
|
:class:`~django.forms.Select` or :class:`~django.forms.RadioSelect`
|
|
by providing the widget ``choices``::
|
|
|
|
NullBooleanField(
|
|
widget=Select(
|
|
choices=[
|
|
('', 'Unknown'),
|
|
(True, 'Yes'),
|
|
(False, 'No'),
|
|
]
|
|
)
|
|
)
|
|
|
|
``RegexField``
|
|
--------------
|
|
|
|
.. class:: RegexField(**kwargs)
|
|
|
|
* Default widget: :class:`TextInput`
|
|
* Empty value: Whatever you've given as ``empty_value``.
|
|
* Normalizes to: A string.
|
|
* Uses :class:`~django.core.validators.RegexValidator` to validate that
|
|
the given value matches a certain regular expression.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
Takes one required argument:
|
|
|
|
.. attribute:: regex
|
|
|
|
A regular expression specified either as a string or a compiled regular
|
|
expression object.
|
|
|
|
Also takes ``max_length``, ``min_length``, ``strip``, and ``empty_value``
|
|
which work just as they do for :class:`CharField`.
|
|
|
|
.. attribute:: strip
|
|
|
|
Defaults to ``False``. If enabled, stripping will be applied before the
|
|
regex validation.
|
|
|
|
``SlugField``
|
|
-------------
|
|
|
|
.. class:: SlugField(**kwargs)
|
|
|
|
* Default widget: :class:`TextInput`
|
|
* Empty value: Whatever you've given as :attr:`empty_value`.
|
|
* Normalizes to: A string.
|
|
* Uses :class:`~django.core.validators.validate_slug` or
|
|
:class:`~django.core.validators.validate_unicode_slug` to validate that
|
|
the given value contains only letters, numbers, underscores, and hyphens.
|
|
* Error messages: ``required``, ``invalid``
|
|
|
|
This field is intended for use in representing a model
|
|
:class:`~django.db.models.SlugField` in forms.
|
|
|
|
Takes two optional parameters:
|
|
|
|
.. attribute:: allow_unicode
|
|
|
|
A boolean instructing the field to accept Unicode letters in addition
|
|
to ASCII letters. Defaults to ``False``.
|
|
|
|
.. attribute:: empty_value
|
|
|
|
The value to use to represent "empty". Defaults to an empty string.
|
|
|
|
``TimeField``
|
|
-------------
|
|
|
|
.. class:: TimeField(**kwargs)
|
|
|
|
* Default widget: :class:`TimeInput`
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python ``datetime.time`` object.
|
|
* Validates that the given value is either a ``datetime.time`` or string
|
|
formatted in a particular time format.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
Takes one optional argument:
|
|
|
|
.. attribute:: input_formats
|
|
|
|
A list of formats used to attempt to convert a string to a valid
|
|
``datetime.time`` object.
|
|
|
|
If no ``input_formats`` argument is provided, the default input formats are
|
|
taken from :setting:`TIME_INPUT_FORMATS` if :setting:`USE_L10N` is
|
|
``False``, or from the active locale format ``TIME_INPUT_FORMATS`` key if
|
|
localization is enabled. See also :doc:`format localization
|
|
</topics/i18n/formatting>`.
|
|
|
|
``URLField``
|
|
------------
|
|
|
|
.. class:: URLField(**kwargs)
|
|
|
|
* Default widget: :class:`URLInput`
|
|
* Empty value: Whatever you've given as ``empty_value``.
|
|
* Normalizes to: A string.
|
|
* Uses :class:`~django.core.validators.URLValidator` to validate that the
|
|
given value is a valid URL.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
Has three optional arguments ``max_length``, ``min_length``, and
|
|
``empty_value`` which work just as they do for :class:`CharField`.
|
|
|
|
``UUIDField``
|
|
-------------
|
|
|
|
.. class:: UUIDField(**kwargs)
|
|
|
|
* Default widget: :class:`TextInput`
|
|
* Empty value: ``None``
|
|
* Normalizes to: A :class:`~python:uuid.UUID` object.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
This field will accept any string format accepted as the ``hex`` argument
|
|
to the :class:`~python:uuid.UUID` constructor.
|
|
|
|
Slightly complex built-in ``Field`` classes
|
|
===========================================
|
|
|
|
``ComboField``
|
|
--------------
|
|
|
|
.. class:: ComboField(**kwargs)
|
|
|
|
* Default widget: :class:`TextInput`
|
|
* Empty value: ``''`` (an empty string)
|
|
* Normalizes to: A string.
|
|
* Validates the given value against each of the fields specified
|
|
as an argument to the ``ComboField``.
|
|
* Error message keys: ``required``, ``invalid``
|
|
|
|
Takes one extra required argument:
|
|
|
|
.. attribute:: fields
|
|
|
|
The list of fields that should be used to validate the field's value (in
|
|
the order in which they are provided).
|
|
|
|
>>> from django.forms import ComboField
|
|
>>> f = ComboField(fields=[CharField(max_length=20), EmailField()])
|
|
>>> f.clean('test@example.com')
|
|
'test@example.com'
|
|
>>> f.clean('longemailaddress@example.com')
|
|
Traceback (most recent call last):
|
|
...
|
|
ValidationError: ['Ensure this value has at most 20 characters (it has 28).']
|
|
|
|
``MultiValueField``
|
|
-------------------
|
|
|
|
.. class:: MultiValueField(fields=(), **kwargs)
|
|
|
|
* Default widget: :class:`TextInput`
|
|
* Empty value: ``''`` (an empty string)
|
|
* Normalizes to: the type returned by the ``compress`` method of the subclass.
|
|
* Validates the given value against each of the fields specified
|
|
as an argument to the ``MultiValueField``.
|
|
* Error message keys: ``required``, ``invalid``, ``incomplete``
|
|
|
|
Aggregates the logic of multiple fields that together produce a single
|
|
value.
|
|
|
|
This field is abstract and must be subclassed. In contrast with the
|
|
single-value fields, subclasses of :class:`MultiValueField` must not
|
|
implement :meth:`~django.forms.Field.clean` but instead - implement
|
|
:meth:`~MultiValueField.compress`.
|
|
|
|
Takes one extra required argument:
|
|
|
|
.. attribute:: fields
|
|
|
|
A tuple of fields whose values are cleaned and subsequently combined
|
|
into a single value. Each value of the field is cleaned by the
|
|
corresponding field in ``fields`` -- the first value is cleaned by the
|
|
first field, the second value is cleaned by the second field, etc.
|
|
Once all fields are cleaned, the list of clean values is combined into
|
|
a single value by :meth:`~MultiValueField.compress`.
|
|
|
|
Also takes some optional arguments:
|
|
|
|
.. attribute:: require_all_fields
|
|
|
|
Defaults to ``True``, in which case a ``required`` validation error
|
|
will be raised if no value is supplied for any field.
|
|
|
|
When set to ``False``, the :attr:`Field.required` attribute can be set
|
|
to ``False`` for individual fields to make them optional. If no value
|
|
is supplied for a required field, an ``incomplete`` validation error
|
|
will be raised.
|
|
|
|
A default ``incomplete`` error message can be defined on the
|
|
:class:`MultiValueField` subclass, or different messages can be defined
|
|
on each individual field. For example::
|
|
|
|
from django.core.validators import RegexValidator
|
|
|
|
class PhoneField(MultiValueField):
|
|
def __init__(self, **kwargs):
|
|
# Define one message for all fields.
|
|
error_messages = {
|
|
'incomplete': 'Enter a country calling code and a phone number.',
|
|
}
|
|
# Or define a different message for each field.
|
|
fields = (
|
|
CharField(
|
|
error_messages={'incomplete': 'Enter a country calling code.'},
|
|
validators=[
|
|
RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.'),
|
|
],
|
|
),
|
|
CharField(
|
|
error_messages={'incomplete': 'Enter a phone number.'},
|
|
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')],
|
|
),
|
|
CharField(
|
|
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],
|
|
required=False,
|
|
),
|
|
)
|
|
super().__init__(
|
|
error_messages=error_messages, fields=fields,
|
|
require_all_fields=False, **kwargs
|
|
)
|
|
|
|
.. attribute:: MultiValueField.widget
|
|
|
|
Must be a subclass of :class:`django.forms.MultiWidget`.
|
|
Default value is :class:`~django.forms.TextInput`, which
|
|
probably is not very useful in this case.
|
|
|
|
.. method:: compress(data_list)
|
|
|
|
Takes a list of valid values and returns a "compressed" version of
|
|
those values -- in a single value. For example,
|
|
:class:`SplitDateTimeField` is a subclass which combines a time field
|
|
and a date field into a ``datetime`` object.
|
|
|
|
This method must be implemented in the subclasses.
|
|
|
|
``SplitDateTimeField``
|
|
----------------------
|
|
|
|
.. class:: SplitDateTimeField(**kwargs)
|
|
|
|
* Default widget: :class:`SplitDateTimeWidget`
|
|
* Empty value: ``None``
|
|
* Normalizes to: A Python ``datetime.datetime`` object.
|
|
* Validates that the given value is a ``datetime.datetime`` or string
|
|
formatted in a particular datetime format.
|
|
* Error message keys: ``required``, ``invalid``, ``invalid_date``,
|
|
``invalid_time``
|
|
|
|
Takes two optional arguments:
|
|
|
|
.. attribute:: input_date_formats
|
|
|
|
A list of formats used to attempt to convert a string to a valid
|
|
``datetime.date`` object.
|
|
|
|
If no ``input_date_formats`` argument is provided, the default input formats
|
|
for :class:`DateField` are used.
|
|
|
|
.. attribute:: input_time_formats
|
|
|
|
A list of formats used to attempt to convert a string to a valid
|
|
``datetime.time`` object.
|
|
|
|
If no ``input_time_formats`` argument is provided, the default input formats
|
|
for :class:`TimeField` are used.
|
|
|
|
.. _fields-which-handle-relationships:
|
|
|
|
Fields which handle relationships
|
|
=================================
|
|
|
|
Two fields are available for representing relationships between
|
|
models: :class:`ModelChoiceField` and
|
|
:class:`ModelMultipleChoiceField`. Both of these fields require a
|
|
single ``queryset`` parameter that is used to create the choices for
|
|
the field. Upon form validation, these fields will place either one
|
|
model object (in the case of ``ModelChoiceField``) or multiple model
|
|
objects (in the case of ``ModelMultipleChoiceField``) into the
|
|
``cleaned_data`` dictionary of the form.
|
|
|
|
For more complex uses, you can specify ``queryset=None`` when declaring the
|
|
form field and then populate the ``queryset`` in the form's ``__init__()``
|
|
method::
|
|
|
|
class FooMultipleChoiceForm(forms.Form):
|
|
foo_select = forms.ModelMultipleChoiceField(queryset=None)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.fields['foo_select'].queryset = ...
|
|
|
|
Both ``ModelChoiceField`` and ``ModelMultipleChoiceField`` have an ``iterator``
|
|
attribute which specifies the class used to iterate over the queryset when
|
|
generating choices. See :ref:`iterating-relationship-choices` for details.
|
|
|
|
``ModelChoiceField``
|
|
--------------------
|
|
|
|
.. class:: ModelChoiceField(**kwargs)
|
|
|
|
* Default widget: :class:`Select`
|
|
* Empty value: ``None``
|
|
* Normalizes to: A model instance.
|
|
* Validates that the given id exists in the queryset.
|
|
* Error message keys: ``required``, ``invalid_choice``
|
|
|
|
The ``invalid_choice`` error message may contain ``%(value)s``, which will
|
|
be replaced with the selected choice.
|
|
|
|
Allows the selection of a single model object, suitable for representing a
|
|
foreign key. Note that the default widget for ``ModelChoiceField`` becomes
|
|
impractical when the number of entries increases. You should avoid using it
|
|
for more than 100 items.
|
|
|
|
A single argument is required:
|
|
|
|
.. attribute:: queryset
|
|
|
|
A ``QuerySet`` of model objects from which the choices for the field
|
|
are derived and which is used to validate the user's selection. It's
|
|
evaluated when the form is rendered.
|
|
|
|
``ModelChoiceField`` also takes two optional arguments:
|
|
|
|
.. attribute:: empty_label
|
|
|
|
By default the ``<select>`` widget used by ``ModelChoiceField`` will have an
|
|
empty choice at the top of the list. You can change the text of this
|
|
label (which is ``"---------"`` by default) with the ``empty_label``
|
|
attribute, or you can disable the empty label entirely by setting
|
|
``empty_label`` to ``None``::
|
|
|
|
# A custom empty label
|
|
field1 = forms.ModelChoiceField(queryset=..., empty_label="(Nothing)")
|
|
|
|
# No empty label
|
|
field2 = forms.ModelChoiceField(queryset=..., empty_label=None)
|
|
|
|
Note that if a ``ModelChoiceField`` is required and has a default
|
|
initial value, no empty choice is created (regardless of the value
|
|
of ``empty_label``).
|
|
|
|
.. attribute:: to_field_name
|
|
|
|
This optional argument is used to specify the field to use as the value
|
|
of the choices in the field's widget. Be sure it's a unique field for
|
|
the model, otherwise the selected value could match more than one
|
|
object. By default it is set to ``None``, in which case the primary key
|
|
of each object will be used. For example::
|
|
|
|
# No custom to_field_name
|
|
field1 = forms.ModelChoiceField(queryset=...)
|
|
|
|
would yield:
|
|
|
|
.. code-block:: html
|
|
|
|
<select id="id_field1" name="field1">
|
|
<option value="obj1.pk">Object1</option>
|
|
<option value="obj2.pk">Object2</option>
|
|
...
|
|
</select>
|
|
|
|
and::
|
|
|
|
# to_field_name provided
|
|
field2 = forms.ModelChoiceField(queryset=..., to_field_name="name")
|
|
|
|
would yield:
|
|
|
|
.. code-block:: html
|
|
|
|
<select id="id_field2" name="field2">
|
|
<option value="obj1.name">Object1</option>
|
|
<option value="obj2.name">Object2</option>
|
|
...
|
|
</select>
|
|
|
|
``ModelChoiceField`` also has the attribute:
|
|
|
|
.. attribute:: iterator
|
|
|
|
The iterator class used to generate field choices from ``queryset``. By
|
|
default, :class:`ModelChoiceIterator`.
|
|
|
|
The ``__str__()`` method of the model will be called to generate string
|
|
representations of the objects for use in the field's choices. To provide
|
|
customized representations, subclass ``ModelChoiceField`` and override
|
|
``label_from_instance``. This method will receive a model object and should
|
|
return a string suitable for representing it. For example::
|
|
|
|
from django.forms import ModelChoiceField
|
|
|
|
class MyModelChoiceField(ModelChoiceField):
|
|
def label_from_instance(self, obj):
|
|
return "My Object #%i" % obj.id
|
|
|
|
.. versionchanged:: 4.0
|
|
|
|
Support for containing ``%(value)s`` in the ``invalid_choice`` error
|
|
message was added.
|
|
|
|
``ModelMultipleChoiceField``
|
|
----------------------------
|
|
|
|
.. class:: ModelMultipleChoiceField(**kwargs)
|
|
|
|
* Default widget: :class:`SelectMultiple`
|
|
* Empty value: An empty ``QuerySet`` (``self.queryset.none()``)
|
|
* Normalizes to: A ``QuerySet`` of model instances.
|
|
* Validates that every id in the given list of values exists in the
|
|
queryset.
|
|
* Error message keys: ``required``, ``invalid_list``, ``invalid_choice``,
|
|
``invalid_pk_value``
|
|
|
|
The ``invalid_choice`` message may contain ``%(value)s`` and the
|
|
``invalid_pk_value`` message may contain ``%(pk)s``, which will be
|
|
substituted by the appropriate values.
|
|
|
|
Allows the selection of one or more model objects, suitable for
|
|
representing a many-to-many relation. As with :class:`ModelChoiceField`,
|
|
you can use ``label_from_instance`` to customize the object
|
|
representations.
|
|
|
|
A single argument is required:
|
|
|
|
.. attribute:: queryset
|
|
|
|
Same as :class:`ModelChoiceField.queryset`.
|
|
|
|
Takes one optional argument:
|
|
|
|
.. attribute:: to_field_name
|
|
|
|
Same as :class:`ModelChoiceField.to_field_name`.
|
|
|
|
``ModelMultipleChoiceField`` also has the attribute:
|
|
|
|
.. attribute:: iterator
|
|
|
|
Same as :class:`ModelChoiceField.iterator`.
|
|
|
|
.. _iterating-relationship-choices:
|
|
|
|
Iterating relationship choices
|
|
------------------------------
|
|
|
|
By default, :class:`ModelChoiceField` and :class:`ModelMultipleChoiceField` use
|
|
:class:`ModelChoiceIterator` to generate their field ``choices``.
|
|
|
|
When iterated, ``ModelChoiceIterator`` yields 2-tuple choices containing
|
|
:class:`ModelChoiceIteratorValue` instances as the first ``value`` element in
|
|
each choice. ``ModelChoiceIteratorValue`` wraps the choice value while
|
|
maintaining a reference to the source model instance that can be used in custom
|
|
widget implementations, for example, to add `data-* attributes`_ to
|
|
``<option>`` elements.
|
|
|
|
.. _`data-* attributes`: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*
|
|
|
|
For example, consider the following models::
|
|
|
|
from django.db import models
|
|
|
|
class Topping(models.Model):
|
|
name = models.CharField(max_length=100)
|
|
price = models.DecimalField(decimal_places=2, max_digits=6)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class Pizza(models.Model):
|
|
topping = models.ForeignKey(Topping, on_delete=models.CASCADE)
|
|
|
|
You can use a :class:`~django.forms.Select` widget subclass to include
|
|
the value of ``Topping.price`` as the HTML attribute ``data-price`` for each
|
|
``<option>`` element::
|
|
|
|
from django import forms
|
|
|
|
class ToppingSelect(forms.Select):
|
|
def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
|
|
option = super().create_option(name, value, label, selected, index, subindex, attrs)
|
|
if value:
|
|
option['attrs']['data-price'] = value.instance.price
|
|
return option
|
|
|
|
class PizzaForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Pizza
|
|
fields = ['topping']
|
|
widgets = {'topping': ToppingSelect}
|
|
|
|
This will render the ``Pizza.topping`` select as:
|
|
|
|
.. code-block:: html
|
|
|
|
<select id="id_topping" name="topping" required>
|
|
<option value="" selected>---------</option>
|
|
<option value="1" data-price="1.50">mushrooms</option>
|
|
<option value="2" data-price="1.25">onions</option>
|
|
<option value="3" data-price="1.75">peppers</option>
|
|
<option value="4" data-price="2.00">pineapple</option>
|
|
</select>
|
|
|
|
For more advanced usage you may subclass ``ModelChoiceIterator`` in order to
|
|
customize the yielded 2-tuple choices.
|
|
|
|
``ModelChoiceIterator``
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
.. class:: ModelChoiceIterator(field)
|
|
|
|
The default class assigned to the ``iterator`` attribute of
|
|
:class:`ModelChoiceField` and :class:`ModelMultipleChoiceField`. An
|
|
iterable that yields 2-tuple choices from the queryset.
|
|
|
|
A single argument is required:
|
|
|
|
.. attribute:: field
|
|
|
|
The instance of ``ModelChoiceField`` or ``ModelMultipleChoiceField`` to
|
|
iterate and yield choices.
|
|
|
|
``ModelChoiceIterator`` has the following method:
|
|
|
|
.. method:: __iter__()
|
|
|
|
Yields 2-tuple choices, in the ``(value, label)`` format used by
|
|
:attr:`ChoiceField.choices`. The first ``value`` element is a
|
|
:class:`ModelChoiceIteratorValue` instance.
|
|
|
|
``ModelChoiceIteratorValue``
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
.. class:: ModelChoiceIteratorValue(value, instance)
|
|
|
|
Two arguments are required:
|
|
|
|
.. attribute:: value
|
|
|
|
The value of the choice. This value is used to render the ``value``
|
|
attribute of an HTML ``<option>`` element.
|
|
|
|
.. attribute:: instance
|
|
|
|
The model instance from the queryset. The instance can be accessed in
|
|
custom ``ChoiceWidget.create_option()`` implementations to adjust the
|
|
rendered HTML.
|
|
|
|
``ModelChoiceIteratorValue`` has the following method:
|
|
|
|
.. method:: __str__()
|
|
|
|
Return ``value`` as a string to be rendered in HTML.
|
|
|
|
Creating custom fields
|
|
======================
|
|
|
|
If the built-in ``Field`` classes don't meet your needs, you can create custom
|
|
``Field`` classes. To do this, create a subclass of ``django.forms.Field``. Its
|
|
only requirements are that it implement a ``clean()`` method and that its
|
|
``__init__()`` method accept the core arguments mentioned above (``required``,
|
|
``label``, ``initial``, ``widget``, ``help_text``).
|
|
|
|
You can also customize how a field will be accessed by overriding
|
|
:meth:`~django.forms.Field.get_bound_field()`.
|