Form#
Base class: Part
Describe a Form. Example:
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:
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:
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:
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
(evaluated)Type:
Union[str, iommi._web_compat.Template]
Default:
iommi/form/actions.html
after
(evaluated)Type:
Union[int, str]
assets
Type:
Namespace
attr
(evaluated)Type:
str
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
(evaluated)Type:
Union[str, iommi._web_compat.Template]
h_tag
(evaluated)Type:
Union[iommi.fragment.Fragment, str]
include
(evaluated)Type:
bool
instance
Type:
Any
iommi_style
Type:
str
member_class
Type:
Type[iommi.form.Field]
model
(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
(evaluated)Type:
Union[str, iommi._web_compat.Template]
Default:
iommi/form/form.html
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': <class 'iommi.fragment.Fragment'>, 'include': <function Form.<lambda> at 0x7fca64a2ab60>, 'after': 0, 'tag': 'p', 'children__text': <function Form.<lambda> at 0x7fca64a2ae80>}
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:
def post_validation(form, **_):
form.add_error('global error')
form = Form.create(
auto__model=Album,
post_validation=post_validation,
)
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.