Construcción de formularios robustos en Pyramid con Deform y Colander

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')
    )

Etiquetas: pyramid deform colander python-web form-validation

Publicado el 9-17 17:21