# Static Forms

{% hint style="success" %}
This is the official documentation of the `forestadmin-agent-django` and `forestadmin-agent-flask` Python agents.
{% endhint %}

Very often, you will need to ask for user inputs before triggering the logic behind an action.

For example, you might want to specify a reason if you want to block a user account. Or set the amount to charge a user’s credit card.

![Action Form displayed on Forest Admin](/files/hZQn6kvvVypxNzVdbmgn)

## Field Configuration

### Properties

Fields are configurable using the following properties:

| Property        | Expected value                                                                                                                                                      | Description                                                                                                               |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `type`          | `Boolean`, `Date`, `Dateonly`, `Enum`, `Json`, `Number`, `String`, `NumberList`, `EnumList`, `StringList`, `FileList` and [`Collection`](#references-to-records)`}` | Set the type of the field.                                                                                                |
| `label`         | string                                                                                                                                                              | Set the label of the field.                                                                                               |
| `id`            | string                                                                                                                                                              | Set the id of the field. The is used internally and to access values from the context. If not set the label will be used. |
| `description`   | string                                                                                                                                                              | Set the description of the field.                                                                                         |
| `is_required`   | boolean                                                                                                                                                             | Make the field required (default false).                                                                                  |
| `is_read_only`  | boolean                                                                                                                                                             | Make the field read-only (default false).                                                                                 |
| `default_value` | any                                                                                                                                                                 | Set the default value of the field.                                                                                       |
| `enum_values`   | array of strings                                                                                                                                                    | Change the list of possible values of the field when type is `Enum`.                                                      |

```python
from typing import Union
from forestadmin.datasource_toolkit.decorators.action.context.single import ActionContextSingle
from forestadmin.datasource_toolkit.decorators.action.result_builder import ResultBuilder
from forestadmin.datasource_toolkit.interfaces.actions import ActionResult

async def execute(
    context: ActionContextSingle, result_builder: ResultBuilder
) -> Union[None, ActionResult]:
    record = await context.get_record(['stripeId', 'address:country'])
    form_values = context.form_values

    # ... charge the credit card ...

    return result_builder.success("Amount charged")

agent.customize_collection("Company").add_action("Charge credit card", {
    "scope": "Single",
    "execute": execute,
    "form":[
      {
        "type": "Number",
        "label": "amount",
        "description": "The amount (USD) to charge the credit card. Example: 42.50",
        "is_required": True,
      }
    ],
})
```

### References to records

![Reference widget on an action form](/files/sAWUYI8tLrgudc9Ol8tY)

When using the `Collection` type, you can create a reference to a record of any collection.

The value of the field will be the primary key of the selected record.

{% hint style="info" %}
Note that the value will be stored in an array as the target collection may be using a composite primary key. When not using a composite primary key, the array can be assumed to contain a single value.
{% endhint %}

```python
from typing import Union
from forestadmin.datasource_toolkit.decorators.action.types.actions import ActionSingle
from forestadmin.datasource_toolkit.decorators.action.result_builder import ResultBuilder
from forestadmin.datasource_toolkit.interfaces.actions import ActionResult

async def execute(
    context: ActionContextSingle, result_builder: ResultBuilder
) -> Union[None, ActionResult]:
    # Retrieve user id from the form
    user_id = context.form_values["Assigne"]

agent.customize_collection("Company").add_action("Charge credit card", {
    "form":[
        {
            "label": "Assigne",
            "type": "Collection",
            "description": "The user to assign the ticket to",
            "collection_name": "user",
            "is_required": True,
        }
    ],
    "scope": "Single",
    "execute": execute,
})
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.forestadmin.com/developer-guide-agents-python/agent-customization/actions/forms-static.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
