Skip to main content
The FormFactory class provides a convenient factory pattern for creating forms and form builders. It simplifies the process of instantiating forms from form types and managing form data.

Class Methods

create_builder

Creates a new form builder instance.
from framefox.core.form import FormFactory

builder = FormFactory.create_builder(data=user, options={'csrf_protection': True})
data
Any
Initial data to populate the form. Can be an object, dictionary, or None.
options
Dict[str, Any]
Configuration options for the form builder.
FormBuilder
FormBuilder
Returns a configured FormBuilder instance ready to add fields.

create_form

Creates a complete form from a form type class.
from framefox.core.form import FormFactory
from myapp.forms import UserRegistrationForm

form = FormFactory.create_form(
    form_type=UserRegistrationForm,
    data=user,
    options={'action': '/register'}
)
form_type
Type[FormTypeInterface]
required
The form type class that defines the form structure. Must implement FormTypeInterface.
data
Any
Initial data to populate the form. Can be an object, dictionary, or None.
options
Dict[str, Any]
Configuration options for the form.
Form
Form
Returns a fully built Form instance with all fields configured.

Usage Examples

Basic Form Creation

from framefox.core.form import FormFactory
from myapp.forms import ContactForm

# Create a simple form
form = FormFactory.create_form(ContactForm)

# Handle in a route
@app.post("/contact")
async def contact(request: Request):
    form = FormFactory.create_form(ContactForm)
    
    if await form.handle_request(request):
        # Form is valid, process data
        data = form.get_data()
        return {"message": "Form submitted successfully"}
    
    return {"form": form.create_view()}

Form with Initial Data

from framefox.core.form import FormFactory
from myapp.forms import UserEditForm
from myapp.models import User

# Get user from database
user = User.query.get(id=1)

# Create form pre-filled with user data
form = FormFactory.create_form(
    form_type=UserEditForm,
    data=user
)

if await form.handle_request(request):
    # Data is automatically applied back to user object
    db.commit()

Using FormBuilder Directly

from framefox.core.form import FormFactory
from framefox.core.form.type import TextType, EmailType

# Create builder
builder = FormFactory.create_builder()

# Add fields programmatically
builder.add('name', TextType, {'label': 'Full Name', 'required': True})
builder.add('email', EmailType, {'label': 'Email Address', 'required': True})

# Get the form
form = builder.get_form()

Form with Custom Options

from framefox.core.form import FormFactory
from myapp.forms import ProductForm

form = FormFactory.create_form(
    form_type=ProductForm,
    options={
        'action': '/products/create',
        'method': 'POST',
        'csrf_protection': True,
        'validation_groups': ['create']
    }
)

Integration with Routes

from fastapi import FastAPI, Request
from framefox.core.form import FormFactory
from myapp.forms import ArticleForm
from myapp.models import Article

app = FastAPI()

@app.get("/articles/new")
async def new_article(request: Request):
    form = FormFactory.create_form(ArticleForm)
    return {"form": form.create_view()}

@app.post("/articles/create")
async def create_article(request: Request):
    article = Article()
    form = FormFactory.create_form(ArticleForm, data=article)
    
    if await form.handle_request(request):
        # Save to database
        db.add(article)
        db.commit()
        return {"success": True, "id": article.id}
    
    return {"errors": form.errors}

@app.get("/articles/{id}/edit")
async def edit_article(id: int):
    article = Article.query.get(id=id)
    form = FormFactory.create_form(ArticleForm, data=article)
    return {"form": form.create_view()}

@app.post("/articles/{id}/update")
async def update_article(id: int, request: Request):
    article = Article.query.get(id=id)
    form = FormFactory.create_form(ArticleForm, data=article)
    
    if await form.handle_request(request):
        db.commit()
        return {"success": True}
    
    return {"errors": form.errors}

See Also

  • FormType - Creating custom form type classes
  • Form Builder - Building forms programmatically
  • Form - Working with form instances

Build docs developers (and LLMs) love