======= Widgets ======= .. module:: django.forms.widgets :synopsis: Django's built-in form widgets. .. currentmodule:: django.forms A widget is Django's representation of a HTML input element. The widget handles the rendering of the HTML, and the extraction of data from a GET/POST dictionary that corresponds to the widget. Specifying widgets ------------------ Whenever you specify a field on a form, Django will use a default widget that is appropriate to the type of data that is to be displayed. To find which widget is used on which field, see the documentation about :ref:`built-in fields`. However, if you want to use a different widget for a field, you can just use the :attr:`~Field.widget` argument on the field definition. For example: .. code-block:: python from django import forms class CommentForm(forms.Form): name = forms.CharField() url = forms.URLField() comment = forms.CharField(widget=forms.Textarea) This would specify a form with a comment that uses a larger :class:`Textarea` widget, rather than the default :class:`TextInput` widget. Setting arguments for widgets ----------------------------- Many widgets have optional extra arguments; they can be set when defining the widget on the field. In the following example, the :attr:`~SelectDateWidget.years` attribute is set for a :class:`~django.forms.extras.widgets.SelectDateWidget`: .. code-block:: python from django.forms.fields import DateField, ChoiceField, MultipleChoiceField from django.forms.widgets import RadioSelect, CheckboxSelectMultiple from django.forms.extras.widgets import SelectDateWidget BIRTH_YEAR_CHOICES = ('1980', '1981', '1982') GENDER_CHOICES = (('m', 'Male'), ('f', 'Female')) FAVORITE_COLORS_CHOICES = (('blue', 'Blue'), ('green', 'Green'), ('black', 'Black')) class SimpleForm(forms.Form): birth_year = DateField(widget=SelectDateWidget(years=BIRTH_YEAR_CHOICES)) gender = ChoiceField(widget=RadioSelect, choices=GENDER_CHOICES) favorite_colors = forms.MultipleChoiceField(required=False, widget=CheckboxSelectMultiple, choices=FAVORITE_COLORS_CHOICES) See the :ref:`built-in widgets` for more information about which widgets are available and which arguments they accept. Widgets inheriting from the Select widget ----------------------------------------- Widgets inheriting from the :class:`Select` widget deal with choices. They present the user with a list of options to choose from. The different widgets present this choice differently; the :class:`Select` widget itself uses a `` Url: Comment: On a real Web page, you probably don't want every widget to look the same. You might want a larger input element for the comment, and you might want the 'name' widget to have some special CSS class. To do this, you use the :attr:`Widget.attrs` argument when creating the widget: For example: .. code-block:: python class CommentForm(forms.Form): name = forms.CharField( widget=forms.TextInput(attrs={'class':'special'})) url = forms.URLField() comment = forms.CharField( widget=forms.TextInput(attrs={'size':'40'})) Django will then include the extra attributes in the rendered output: .. code-block:: python >>> f = CommentForm(auto_id=False) >>> f.as_table() Name: Url: Comment: .. _built-in widgets: Built-in widgets ---------------- Django provides a representation of all the basic HTML widgets, plus some commonly used groups of widgets: ``Widget`` ~~~~~~~~~~ .. class:: Widget This abstract class cannot be rendered, but provides the basic attribute :attr:`~Widget.attrs`. .. attribute:: Widget.attrs A dictionary containing HTML attributes to be set on the rendered widget. .. code-block:: python >>> name = forms.TextInput(attrs={'size': 10, 'title': 'Your name',}) >>> name.render('name', 'A name') u'' ``TextInput`` ~~~~~~~~~~~~~ .. class:: TextInput Text input: ```` ``PasswordInput`` ~~~~~~~~~~~~~~~~~ .. class:: PasswordInput Password input: ```` Takes one optional argument: .. attribute:: PasswordInput.render_value Determines whether the widget will have a value filled in when the form is re-displayed after a validation error (default is ``False``). .. versionchanged:: 1.3 The default value for :attr:`~PasswordInput.render_value` was changed from ``True`` to ``False`` ``HiddenInput`` ~~~~~~~~~~~~~~~ .. class:: HiddenInput Hidden input: ```` ``MultipleHiddenInput`` ~~~~~~~~~~~~~~~~~~~~~~~ .. class:: MultipleHiddenInput Multiple ```` widgets. A widget that handles multiple hidden widgets for fields that have a list of values. .. attribute:: MultipleHiddenInput.choices This attribute is optional when the field does not have a :attr:`~Field.choices` attribute. If it does, it will override anything you set here when the attribute is updated on the :class:`Field`. ``FileInput`` ~~~~~~~~~~~~~ .. class:: FileInput File upload input: ```` ``ClearableFileInput`` ~~~~~~~~~~~~~~~~~~~~~~ .. class:: ClearableFileInput .. versionadded:: 1.3 File upload input: ````, with an additional checkbox input to clear the field's value, if the field is not required and has initial data. ``DateInput`` ~~~~~~~~~~~~~ .. class:: DateInput Date input as a simple text box: ```` Takes one optional argument: .. attribute:: DateInput.format The format in which this field's initial value will be displayed. If no ``format`` argument is provided, the default format is the first format found in :setting:`DATE_INPUT_FORMATS` and respects :ref:`format-localization`. ``DateTimeInput`` ~~~~~~~~~~~~~~~~~ .. class:: DateTimeInput Date/time input as a simple text box: ```` Takes one optional argument: .. attribute:: DateTimeInput.format The format in which this field's initial value will be displayed. If no ``format`` argument is provided, the default format is the first format found in :setting:`DATETIME_INPUT_FORMATS` and respects :ref:`format-localization`. ``TimeInput`` ~~~~~~~~~~~~~ .. class:: TimeInput Time input as a simple text box: ```` Takes one optional argument: .. attribute:: TimeInput.format The format in which this field's initial value will be displayed. If no ``format`` argument is provided, the default format is the first format found in :setting:`TIME_INPUT_FORMATS` and respects :ref:`format-localization`. ``Textarea`` ~~~~~~~~~~~~ .. class:: Textarea Text area: ```` ``CheckboxInput`` ~~~~~~~~~~~~~~~~~ .. class:: CheckboxInput Checkbox: ```` Takes one optional argument: .. attribute:: CheckboxInput.check_test A callable that takes the value of the CheckBoxInput and returns ``True`` if the checkbox should be checked for that value. ``Select`` ~~~~~~~~~~ .. class:: Select Select widget: ```` .. attribute:: Select.choices This attribute is optional when the field does not have a :attr:`~Field.choices` attribute. If it does, it will override anything you set here when the attribute is updated on the :class:`Field`. ``NullBooleanSelect`` ~~~~~~~~~~~~~~~~~~~~~ .. class:: NullBooleanSelect Select widget with options 'Unknown', 'Yes' and 'No' ``SelectMultiple`` ~~~~~~~~~~~~~~~~~~ .. class:: SelectMultiple Similar to :class:`Select`, but allows multiple selection: ```` ``RadioSelect`` ~~~~~~~~~~~~~~~ .. class:: RadioSelect Similar to :class:`Select`, but rendered as a list of radio buttons: .. code-block:: html ``CheckboxSelectMultiple`` ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. class:: CheckboxSelectMultiple Similar to :class:`SelectMultiple`, but rendered as a list of check buttons: .. code-block:: html ``MultiWidget`` ~~~~~~~~~~~~~~~ .. class:: MultiWidget Wrapper around multiple other widgets. You'll probably want to use this class with :class:`MultiValueField`. Its ``render()`` method is different than other widgets', because it has to figure out how to split a single value for display in multiple widgets. Subclasses may implement ``format_output``, which takes the list of rendered widgets and returns a string of HTML that formats them any way you'd like. The ``value`` argument used when rendering can be one of two things: * A ``list``. * A single value (e.g., a string) that is the "compressed" representation of a ``list`` of values. In the second case -- i.e., if the value is *not* a list -- ``render()`` will first decompress the value into a ``list`` before rendering it. It does so by calling the ``decompress()`` method, which :class:`MultiWidget`'s subclasses must implement. This method takes a single "compressed" value and returns a ``list``. An example of this is how :class:`SplitDateTimeWidget` turns a :class:`datetime` value into a list with date and time split into two seperate values: .. code-block:: python class SplitDateTimeWidget(MultiWidget): # ... def decompress(self, value): if value: return [value.date(), value.time().replace(microsecond=0)] return [None, None] When ``render()`` executes its HTML rendering, each value in the list is rendered with the corresponding widget -- the first value is rendered in the first widget, the second value is rendered in the second widget, etc. :class:`MultiWidget` has one required argument: .. attribute:: MultiWidget.widgets An iterable containing the widgets needed. ``SplitDateTimeWidget`` ~~~~~~~~~~~~~~~~~~~~~~~ .. class:: SplitDateTimeWidget Wrapper (using :class:`MultiWidget`) around two widgets: :class:`DateInput` for the date, and :class:`TimeInput` for the time. ``SplitDateTimeWidget`` has two optional attributes: .. attribute:: SplitDateTimeWidget.date_format Similar to :attr:`DateInput.format` .. attribute:: SplitDateTimeWidget.time_format Similar to :attr:`TimeInput.format` ``SplitHiddenDateTimeWidget`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. class:: SplitHiddenDateTimeWidget Similar to :class:`SplitDateTimeWidget`, but uses :class:`HiddenInput` for both date and time. .. currentmodule:: django.forms.extras.widgets ``SelectDateWidget`` ~~~~~~~~~~~~~~~~~~~~ .. class:: SelectDateWidget Wrapper around three :class:`~django.forms.Select` widgets: one each for month, day, and year. Note that this widget lives in a separate file from the standard widgets. Takes one optional argument: .. attribute:: SelectDateWidget.years An optional list/tuple of years to use in the "year" select box. The default is a list containing the current year and the next 9 years.