Aug 19, 2014

Chameleon, deform и маленькая хитрость

Deform - это такая штука которая генерит формы, а шаблоны для виджетов в нем написаны в формате Chameleon шаблонизатора.

Простой пример формы (http://deformdemo.xo7.de/nonrequiredfields/):

class Schema(colander.Schema):
    required = colander.SchemaNode(
        colander.String(),
        description='Required Field'
        )
    notrequired = colander.SchemaNode(
        colander.String(),
        missing=unicode(''),
        description='Unrequired Field')
schema = Schema()
form = deform.Form(schema, buttons=('submit',))
return self.render_form(form)
../../../_images/chameleon_deform.png

К полям можно добавлять описание, но если вставить html то он заэскапируется (https://github.com/Pylons/deform/blob/bb4fc86913884deafa9350de86d87fb5232263fa/deform/templates/form.pt#L42). Можно воспользоваться хитрой возможностью Chameleon‘а что бы вывести html.

class HTMLText(object):
    def __init__(self, text):
        self.text = text

    def __html__(self):
        return unicode(self.text)

notrequired = colander.SchemaNode(
                colander.String(),
                missing=unicode(''),
                description=HTMLText('Hello <hr color="red" /> World!!! <hr />'))

Chameleon по умолчанию ищет метод __html__ у объектов и если он есть то выводит его результат в чистом виде. Вот.


Comments

comments powered by Disqus