Form ==== Base class: :doc:`Part` Describe a Form. Example: .. code-block:: python class MyForm(Form): a = Field() b = Field.email() form = MyForm().bind(request=request) You can also create an instance of a form with this syntax if it's more convenient: .. code-block:: python form = Form( fields=dict( a=Field(), b=Field.email(), ), ).bind(request=request) In the common case the fields namespace will contain only instances of `Field`, but iommi actually supports arbitrary `Part` objects. For example: .. code-block:: python form = Form( fields=dict( # Display a and b inside a box box=html.div( attrs__class__box=True, children__a=Field(), children__b=Field.email(), ), # And c regularly c=Field(), ) ) So that writing the application logic (e.g. validation and post handlers) is independent of minor changes to the layout, after bind the `fields` namespace of the form will contain only instances of `Field` keyed by their `_name` independently of how deep they are in the hierarchy. Given the above, an appropriate post_handler would be: .. code-block:: python def post_handler(form, **_): if not form.is_valid(): return print(form.fields.a.value, form.fields.b.value, form.fields.c.value) # And not: # print(form.fields.box.a.value, form.fields.box.b.value, form.fields.c.value) Refinable members ----------------- * `action_class` Type: `Type[iommi.action.Action]` * `actions` Type: `Namespace` * `actions_template`     (:ref:`evaluated `) Type: `Union[str, iommi._web_compat.Template]` Default: `iommi/form/actions.html` * `after`     (:ref:`evaluated `) Type: `Union[int, str]` * `assets` Type: `Namespace` * `attr`     (:ref:`evaluated `) Type: `str` * `attrs`     (:ref:`evaluated `) Type: :doc:`Attrs` * `auto` Type: `Namespace` * `editable` Type: `bool` Default: `True` * `endpoints` Type: `Namespace` * `errors` Type: `Errors` * `extra` Type: `Dict[str, Any]` * `extra_evaluated` Type: `Dict[str, Any]` * `extra_params` * `field_group` Type: `Namespace` * `fields` Type: `Namespace` * `fields_template`     (:ref:`evaluated `) Type: `Union[str, iommi._web_compat.Template]` * `h_tag`     (:ref:`evaluated `) Type: `Union[iommi.fragment.Fragment, str]` * `include`     (:ref:`evaluated `) Type: `bool` * `instance` Type: `Any` * `iommi_style` Type: `str` * `member_class` Type: `Type[iommi.form.Field]` * `model`     (:ref:`evaluated `) Type: `Type[django.db.models.base.Model]` * `page_class` Type: `Type[iommi.page.Page]` * `post_validation` * `read_nested_form_from_instance` Read the nested forms instance from the parent forms instance. This is analogous to `Field.read_from_instance` but for nested forms. * `template`     (:ref:`evaluated `) Type: `Union[str, iommi._web_compat.Template]` Default: `iommi/form/form.html` * `title`     (:ref:`evaluated `) Type: :doc:`Fragment` * `write_nested_form_to_instance` Write the nested_form to the instance. This is analogous to `Field.write_to_instance` but for nested forms. Shortcuts --------- `Form.create` ^^^^^^^^^^^^^ Parent: Form.crud_ Defaults ++++++++ * `extra__is_create` * `True` * `extra__new_instance` * `lambda form, **_: form.model()` * `extra__crud_type` * `create` * `actions__submit__post_handler` * `iommi.form.create_object__post_handler` `Form.crud` ^^^^^^^^^^^ Defaults ++++++++ * `extra__pre_save_all_but_related_fields` * `lambda **kwargs: None, # pragma: no mutate` * `extra__on_save_all_but_related_fields` * `lambda **kwargs: None, # pragma: no mutate` * `extra__pre_save` * `lambda **kwargs: None, # pragma: no mutate` * `extra__on_save` * `lambda **kwargs: None, # pragma: no mutate` * `extra__on_delete` * `lambda **kwargs: None, # pragma: no mutate` * `extra__redirect` * `lambda redirect_to, **_: HttpResponseRedirect(redirect_to)` * `extra__redirect_to` * `None` * `auto` * `Namespace()` `Form.delete` ^^^^^^^^^^^^^ Parent: Form.crud_ Defaults ++++++++ * `actions__submit__call_target__attribute` * `delete` * `actions__submit__post_handler` * `iommi.form.delete_object__post_handler` * `extra__crud_type` * `delete` * `editable` * `False` * `fields__iommi_default_text` * `{'call_target': , 'include': at 0x7f735cba0900>, 'after': 0, 'tag': 'p', 'children__text': at 0x7f735cba0c20>}` `Form.edit` ^^^^^^^^^^^ Parent: Form.crud_ Defaults ++++++++ * `extra__is_create` * `False` * `extra__crud_type` * `edit` * `actions__submit__post_handler` * `iommi.form.edit_object__post_handler` Methods ------- `add_error` ^^^^^^^^^^^ Explicitly add an error message to the forms global error set. Example: .. code-block:: python def post_validation(form, **_): form.add_error('global error') form = Form.create( auto__model=Album, post_validation=post_validation, ) .. raw:: html
▼ Hide result
`apply` ^^^^^^^ Write the new values specified in the form into the instance specified. `as_view` ^^^^^^^^^ `get_errors` ^^^^^^^^^^^^ Get a dict containing two keys: - `global` for errors global to the entire form. - `fields` for errors specific to fields. This is itself a dict with a key for each field. `is_target` ^^^^^^^^^^^ `is_valid` ^^^^^^^^^^ Is the form valid? Can be called inside forms post_validation hook to determine if the individual fields were all valid. `on_bind` ^^^^^^^^^ `on_refine_done` ^^^^^^^^^^^^^^^^ `own_evaluate_parameters` ^^^^^^^^^^^^^^^^^^^^^^^^^ `validate` ^^^^^^^^^^ Static methods -------------- `apply_field` ^^^^^^^^^^^^^ Class methods ------------- `fields_from_model` ^^^^^^^^^^^^^^^^^^^