Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Allow raw HTML in Deform form description fields

How would you stop Deform from escaping HTML in field titles or descriptions when rendering? My current best solution is to search/replace the returned rendered HTML string with what I need.

Deform by default will escape all HTML characters to HTML entities, I want to add an tag in one of the field descriptions.

like image 553
Oli Avatar asked Oct 20 '22 02:10

Oli


1 Answers

Copy the default widget template and modify it to allow unescaped entries.

Descriptions are placed by mapping.pt. It cannot be overridden per widget basis - the mapping template is the same for all the items in the form. You can override mapping by passing item_template to your widget container (Form, Form section). Non-tested example:

  # No .pt extension for the template!
  schema = CSRFSchema(widget=deform.widget.FormWidget(item_template="raw_description_mapping"))

You can use TAL structure expression to unescape HTML.

E.g. example raw_description_mapping.pt for Deform 2:

<tal:def tal:define="title title|field.title;
                     description description|field.description;
                     errormsg errormsg|field.errormsg;
                     item_template item_template|field.widget.item_template"
         i18n:domain="deform">

  <div class="panel panel-default" title="${description}">
    <div class="panel-heading">${title}</div>
    <div class="panel-body">

      <div tal:condition="errormsg" 
           class="clearfix alert alert-message error">
        <p i18n:translate="">
           There was a problem with this section
        </p>
        <p>${errormsg}</p>
      </div>

      <div tal:condition="description">
        ${structure: description}
      </div>

      ${field.start_mapping()}
      <div tal:repeat="child field.children"
           tal:replace="structure child.render_template(item_template)" >
      </div>     
      ${field.end_mapping()}

    </div>
  </div>

</tal:def>

You also need to modify your Pyramid application to load overridden Deform templates when constructing WSGI application with Pyramid's Configurator:

    from pyramid_deform import configure_zpt_renderer

    configure_zpt_renderer(["mypackage:templates/deform", "mypackage2.submodule:form/templates/deform"])
like image 152
Mikko Ohtamaa Avatar answered Oct 22 '22 00:10

Mikko Ohtamaa