Asok Logo Asok
esc

Type to search across all documentation

1 min read
Edit on GitHub

Advanced Forms Features#

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")
})