A form is an easy way to let users display, create and update records through a view. Every form is coupled to a view, a model, and an optional parent form. The model decides which kind of records the form will be able to display/create/update. By specifying preloaded relations, the record loaded by the form will also come with loaded relations.
Before any updates are performed, a form must be submitted. Form submission is done using scripts (in fact, submitting forms is so common that there’s even a QuickAction for it). In some circumstances, every field of a form should not be modifiable by users. In these cases, it is possible to specify fixed attributes. For example, you might have a model with a created_by attribute, which should represent the user that created a specific record. By fixing the user relation attribute to the current user, you will get the desired behavior.
Widgets will automatically detect when a form is present on a view and give you an option to couple them to it. In order for the coupled widgets to be able to display any data, the form must first be loaded with a record. This can be done through scripting, but even easier is to specify the record when navigating to the view. This can be done using the ‘Go to view’ QuickAction. When a record is loaded, submitting the form will update that record. Without any record loaded, submission will attempt to create a new record.