Advanced Forms Features

Keywords: select enum, json fields, model forms, custom validators, form input types, decimal step, html5 inputs

Asok’s form engine now supports modern HTML5 inputs and deep synchronization with the ORM’s advanced fields.

1. Modern HTML5 Fields

Enjoy native browser widgets for specific data types:

from asok import Form

form = Form({
    "q": Form.search("Search"),
    "website": Form.url("Website"),
    "phone": Form.tel("Phone Number"),
    "theme_color": Form.color("Accent Color"),
    "volume": Form.range("Volume", min=0, max=100),
})

2. ORM Integration

Enum Support

Automatically generate a dropdown from any Python enum.Enum class:

import enum
from asok import Form

class TaskStatus(enum.Enum):
    TODO = "todo"
    PROGRESS = "progress"
    DONE = "done"

form = Form({
    "status": Form.enum("Task Status", TaskStatus)
})

JSON Fields

Asok provides a textarea that automatically includes a json validation rule.

from asok import Form

form = Form({
    "metadata": Form.json("Extra Data")
})

3. Automated Model Forms

The Form.from_model() helper now automatically maps advanced ORM types to their corresponding form widgets.

ORM Field

Form Widget

Notes

Field.Decimal(precision=2)

number

Auto-calculates step="0.01"

Field.Enum(MyEnum)

select

Auto-populates choices from MyEnum

Field.JSON()

textarea

Auto-adds json validation rule

Field.UUID()

text

Sets to readonly by default

Example

from asok import Form

# Generate a professional form from your Model in one line
form = Form.from_model(Product, request)

if form.validate():
    Product.create(**form.data)

4. Custom Validation Rules

You can easily register custom rules that link your Forms to the Validator:

from asok.validation import register_rule

def check_username(value, arg, data):
    return value.isalnum()

register_rule("username", check_username, "Username must be alphanumeric.")

# Use it in your form
form = Form({
    "username": Form.text("Username", rules="required|username")
})