Pyramid es un framework web en Python que ofrece gran flexibilidad, permitiendo a los desarrolladores elegir herramientas específicas para cada necesidad. Una de las tarreas más críticas en aplicacoines web es el manejo de formularios, y la combinación de Deform y Colander proporciona una solución potente y elegante para generar, validar y procesar datos de entrada.
¿Por qué usar esta combinación?
- Estructura basada en esquemas: Colander define reglas de validación mediante objetos esquemáticos, facilitando la serialización y deserialización de datos.
- Generación automática de HTML: Deform convierte esos esquemas en formularios visuales sin necesidad de escribir código HTML manualmente.
- Widgets integrados: Incluye controles como selectores de fecha, áreas de texto enriquecido y grupos de casilals.
- Validación personalizable: Permite crear reglas complejas adaptadas a lógica de negocio específica.
- Integración nativa con Pyramid: Funciona sin fricción con vistas, plantillas y rutas del framework.
Instalación y configuración inicial
Agrega deform a tus dependencias en setup.py:
install_requires=[
'pyramid',
'deform',
]
Luego instala con:
$VENV/bin/pip install -e .
Registra los recursos estáticos en tu configurador de Pyramid:
def main(global_config, **settings):
config = Configurator(settings=settings)
config.add_static_view('deform_assets', 'deform:static/')
return config.make_wsgi_app()
Definición de esquemas con Colander
Crea estructuras de datos reutilizables con validación incorporada:
import colander
import deform.widget
class ArticleSchema(colander.Schema):
heading = colander.SchemaNode(
colander.String(),
title="Encabezado",
validator=colander.Length(min=5, max=200)
)
content = colander.SchemaNode(
colander.String(),
title="Contenido",
widget=deform.widget.TextAreaWidget(rows=10),
validator=colander.Length(min=50)
)
Manejo de formularios en vistas Pyramid
Implementa el ciclo completo de renderizado y validación:
@view_config(route_name='create_article', renderer='templates/form.pt')
def create_article(request):
schema = ArticleSchema()
ui_form = deform.Form(schema, buttons=('Guardar',))
if request.method == 'POST':
try:
cleaned_data = ui_form.validate(request.POST.items())
new_entry = Article(
title=cleaned_data['heading'],
text=cleaned_data['content']
)
request.dbsession.add(new_entry)
return HTTPFound(location=request.route_url('home'))
except deform.ValidationFailure as err:
return {'rendered_form': err.render()}
return {'rendered_form': ui_form.render()}
Renderizado en plantilla (Chameleon)
Incluye los recursos necesarios y muestra el formulario:
<html>
<head>
<link rel="stylesheet" href="${request.static_url('deform:static/css/deform.css')}" />
</head>
<body>
<h2>Nuevo Artículo</h2>
${rendered_form | n}
<script src="${request.static_url('deform:static/scripts/deform.js')}"></script>
</body>
</html>
Validadores personalizados
Extiende la lógica de validación según tus reglas de negocio:
def validate_unique_slug(node, value):
session = get_current_session()
if session.query(Article).filter_by(slug=value).first():
raise colander.Invalid(node, "Este slug ya está en uso")
class PublicationSchema(colander.Schema):
slug = colander.SchemaNode(
colander.String(),
validator=validate_unique_slug
)
Widgets personalizados
Modifica la apariencia o comportamiento de los campos:
class SlugInput(deform.widget.TextInputWidget):
template = 'widgets/slug_input.pt'
class EnhancedSchema(colander.Schema):
url_fragment = colander.SchemaNode(
colander.String(),
widget=SlugInput(css_class='slug-field')
)