Deform 2.0
Deform is a server-side framework that generates HTML forms on the server side supporting complex types and integrates with the pyramid web framework. It let's developers develop fast complex web forms.
Join the DZone community and get the full member experience.
Join For FreeDeform 2.0 has been released.
Deform is a Python form library for generating HTML forms on the server side. Date and time picking widgets, rich text editors, forms with dynamically added and removed items, and a few other complex use cases are supported out of the box.
Deform integrates with the Pyramid web framework and several other web frameworks. Deform comes with Chameleon templates and Bootstrap 3 styling. Under the hood, Colander schemas are used for serialization and validation. The Peppercorn library maps HTTP form submissions to nested structure.
Although Deform uses Chameleon templates internally, you can embed rendered Deform forms into any template language.
1. Use Cases
Deform is ideal for complex server-side generated forms. Potential use cases include:
- Complex data entry forms
- Administrative interfaces
- Python based websites with high amount of data manipulation forms
- Websites where additional front end framework is not needed
2. Installation
Install using pip and Python package installation best practices:
pip install deform
3. Example
See all widget examples. Below is a sample form loop using the Pyramid web framework.
Example code:
"""Self-contained Deform demo example."""
from __future__ import print_function
from pyramid.config import Configurator
from pyramid.session import UnencryptedCookieSessionFactoryConfig
from pyramid.httpexceptions import HTTPFound
import colander
import deform
class ExampleSchema(deform.schema.CSRFSchema):
name = colander.SchemaNode(
colander.String(),
title="Name")
age = colander.SchemaNode(
colander.Int(),
default=18,
title="Age",
description="Your age in years")
def mini_example(request):
"""Sample Deform form with validation."""
schema = ExampleSchema().bind(request=request)
# Create a styled button with some extra Bootstrap 3 CSS classes
process_btn = deform.form.Button(name='process', title="Process")
form = deform.form.Form(schema, buttons=(process_btn,))
# User submitted this form
if request.method == "POST":
if 'process' in request.POST:
try:
appstruct = form.validate(request.POST.items())
# Save form data from appstruct
print("Your name:", appstruct["name"])
print("Your age:", appstruct["age"])
# Thank user and take him/her to the next page
request.session.flash('Thank you for the submission.')
# Redirect to the page shows after succesful form submission
return HTTPFound("/")
except deform.exception.ValidationFailure as e:
# Render a form version where errors are visible next to the fields,
# and the submitted values are posted back
rendered_form = e.render()
else:
# Render a form with initial default values
rendered_form = form.render()
return {
# This is just rendered HTML in a string
# and can be embedded in any template language
"rendered_form": rendered_form,
}
def main(global_config, **settings):
"""pserve entry point"""
session_factory = UnencryptedCookieSessionFactoryConfig('seekrit!')
config = Configurator(settings=settings, session_factory=session_factory)
config.include('pyramid_chameleon')
deform.renderer.configure_zpt_renderer()
config.add_static_view('static_deform', 'deform:static')
config.add_route('mini_example', path='/')
config.add_view(mini_example, route_name="mini_example", renderer="templates/mini.pt")
return config.make_wsgi_app()
This example is in deformdemo repository. Run the example with pserve:
pserve mini.ini --reload
4. Status
This library is actively developed and maintained. Deform 2.x branch has been used in production on several sites for more than two years. Automatic test suite has 100% Python code coverage and 500+ tests.
Published at DZone with permission of Mikko Ohtamaa, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments