1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243 |
- ===========
- 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.forms.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 be a Unicode 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.
- .. versionadded:: 1.10
- Support for the ``required`` HTML attribute was added.
- ``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" required /></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 Unicode object.
- * Validates ``max_length`` or ``min_length``, if they are provided.
- Otherwise, all inputs are valid.
- * Error message keys: ``required``, ``max_length``, ``min_length``
- Has three 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
- .. versionadded:: 1.11
- 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 Unicode object.
- * 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 required argument:
- .. attribute:: choices
- Either an iterable (e.g., a list or tuple) of 2-tuples to use as
- choices for this field, 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.
- ``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::
- ['%Y-%m-%d', # '2006-10-25'
- '%m/%d/%Y', # '10/25/2006'
- '%m/%d/%y'] # '10/25/06'
- Additionally, if you specify :setting:`USE_L10N=False<USE_L10N>` in your settings, the
- following will also be included in the default input formats::
- ['%b %d %Y', # 'Oct 25 2006'
- '%b %d, %Y', # 'Oct 25, 2006'
- '%d %b %Y', # '25 Oct 2006'
- '%d %b, %Y', # '25 Oct, 2006'
- '%B %d %Y', # 'October 25 2006'
- '%B %d, %Y', # 'October 25, 2006'
- '%d %B %Y', # '25 October 2006'
- '%d %B, %Y'] # '25 October, 2006'
- 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.
- If no ``input_formats`` argument is provided, the default input formats are::
- ['%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
- '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
- '%Y-%m-%d', # '2006-10-25'
- '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
- '%m/%d/%Y %H:%M', # '10/25/2006 14:30'
- '%m/%d/%Y', # '10/25/2006'
- '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
- '%m/%d/%y %H:%M', # '10/25/06 14:30'
- '%m/%d/%y'] # '10/25/06'
- 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. 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``.
- * Error message keys: ``required``, ``invalid``.
- Accepts any format understood by
- :func:`~django.utils.dateparse.parse_duration`.
- ``EmailField``
- --------------
- .. class:: EmailField(**kwargs)
- * Default widget: :class:`EmailInput`
- * Empty value: ``''`` (an empty string)
- * Normalizes to: A Unicode object.
- * Validates that the given value is a valid email address, using a
- moderately complex regular expression.
- * Error message keys: ``required``, ``invalid``
- Has two optional arguments for validation, ``max_length`` and ``min_length``.
- If provided, these arguments ensure that the string is at most or at least the
- given length.
- ``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: ``None``
- * Normalizes to: A unicode object
- * 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. 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, and that the
- file is of an image format understood 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. Also,
- ``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. 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.
- ``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 Unicode object. 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 Unicode objects.
- * 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``).
- ``RegexField``
- --------------
- .. class:: RegexField(**kwargs)
- * Default widget: :class:`TextInput`
- * Empty value: ``''`` (an empty string)
- * Normalizes to: A Unicode object.
- * Validates that the given value matches against 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``, and ``strip``, 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: ``''`` (an empty string)
- * Normalizes to: A Unicode object.
- * Validates 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 an optional parameter:
- .. attribute:: allow_unicode
- A boolean instructing the field to accept Unicode letters in addition
- to ASCII letters. Defaults to ``False``.
- ``TimeField``
- -------------
- .. class:: TimeField(**kwargs)
- * Default widget: :class:`TextInput`
- * 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::
- '%H:%M:%S', # '14:30:59'
- '%H:%M', # '14:30'
- ``URLField``
- ------------
- .. class:: URLField(**kwargs)
- * Default widget: :class:`URLInput`
- * Empty value: ``''`` (an empty string)
- * Normalizes to: A Unicode object.
- * Validates that the given value is a valid URL.
- * Error message keys: ``required``, ``invalid``
- Takes the following optional arguments:
- .. attribute:: max_length
- .. attribute:: min_length
- These are the same as ``CharField.max_length`` and ``CharField.min_length``.
- ``UUIDField``
- -------------
- .. class:: UUIDField(**kwargs)
- * Default widget: :class:`TextInput`
- * Empty value: ``''`` (an empty string)
- * 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 Unicode object.
- * 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 one extra optional argument:
- .. 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, *args, **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, *args, **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
- =================================
- 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 = ...
- ``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``
- 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 will be derived, and which will be used to validate the
- user's selection.
- ``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>
- 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
- ``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``, ``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`.
- Creating custom fields
- ======================
- If the built-in ``Field`` classes don't meet your needs, you can easily create
- custom ``Field`` classes. To do this, just 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()`.
|