I am using deform in a project that uses pyramid with mako as a templating engine. I rewrote the templates for the widgets I need. I am using a modal for one of the forms so I wrote the mako template and the set the form widget with
form.widget = widget.FormWidget(template='modal')
The form works fine for the initial render, but when calling the validation block
 try:
   appstruct = self.my_form.validate(controls)
     
 except ValidationFailure as e:
   return dict(e.render())
e doesn't render the modal template, but rather the default form. How does make the validation form render using the same template as the form?
Right now I am using this to work around it...it shows the warning when there is an error, but does not display the particular errors on each field:
except ValidationFailure as e:
  form.error = e.error
  form.field = e.field
  return dict(form.render(e.cstruct)
The modal is the popup retail example from deform demo. The schema node just has a couple of text input fields.
Adding example:
facilities view:
@property
def form(self):
  schema = SQLAlchemySchemaNode(Facility)
  return Form(schema, buttons=('submit'))
@view_config(route_name="facilities", renderer="facilities.mako")
def index(self):
  form = self.form
  form.widget = widget.FormWidget(template="modal")
  if 'submit' in self.request.params:    
    try:
      controls = self.request.POST.items()
      appstruct = self.facility_form.validate(controls)
    except ValidationFailure as e:
      return dict(form=e.render())
  return dict(form=form.render())
The mako template then just injects the html:
{ form | n }
				
                        
After playing with it for a while I came up with this solution (not sure if it is optimal). Before returning
e.render(), set the form attributes one.field