微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Deform 和 mako 自定义模板和验证

如何解决使用 Deform 和 mako 自定义模板和验证

我在一个使用金字塔和 mako 作为模板引擎的项目中使用变形。我为我需要的小部件重写了模板。我正在为其中一个表单使用模态,所以我编写了 mako 模板并使用

设置了表单小部件

form.widget = widget.FormWidget(template='modal')

表单在初始渲染时工作正常,但在调用验证块时

 try:
   appstruct = self.my_form.validate(controls)
     
 except ValidationFailure as e:
   return dict(e.render())

e 不呈现模态模板,而是呈现认表单。如何使验证表单使用与表单相同的模板呈现?


现在我正在使用它来解决这个问题...它会在出现错误显示警告,但不会在每个字段上显示特定错误

except ValidationFailure as e:
  form.error = e.error
  form.field = e.field
  return dict(form.render(e.cstruct)

modal 是变形演示中的弹出式零售示例。模式节点只有几个文本输入字段。

添加示例:

设施视图:

@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())

mako 模板然后只注入 html:

{ form | n }

解决方法

玩了一段时间后,我想出了这个解决方案(不确定它是否是最佳的)。在返回 e.render() 之前,在 e.field

上设置表单属性
@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:
      e.field.widget = widget.FormWidget(template="modal")
      e.field.set_widgets({}) ## if using different from defaults
      e.field.formid = "my-popup" ## and any other non default attributes.
      return dict(form=e.render())

  return dict(form=form.render())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。