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})
Initial data to populate the form. Can be an object, dictionary, or None.
Configuration options for the form builder.
Returns a configured FormBuilder instance ready to add fields.
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.
Initial data to populate the form. Can be an object, dictionary, or None.
Configuration options for the form.
Returns a fully built Form instance with all fields configured.
Usage Examples
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()}
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()
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()
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