仅从请求绑定部分表单映射

时间:2013-08-15 15:17:47

标签: scala playframework playframework-2.1

我正在使用Play 2.1.2,我有一个带有以下映射的表单:

Form(
    mapping(
      "id" -> ignored(NotAssigned: Pk[Long]),
      "name" -> nonEmptyText,
      "stock" -> number(min = 0),
      "initialAmount" -> number(min = 0),
      "distUnitId" -> longNumber,
      "categoryId" -> longNumber
    )
    (BarItem.apply)
    (BarItem.unapply)
)

在视图中,我想使用表单助手来编辑值的一部分。特别是,“initialAmount”值只能设置一次 - 创建项目时 - 不允许在编辑时更改。所以我只是不想在表单中显示它并在表单提交后“保留”它以前的值。

目前,编辑视图的有趣部分如下所示:

 @form(routes.Application.update(id), 'class -> "form-inline") {

        <fieldset>

            @inputText(barItemEditForm("name"), '_label -> "Produktbezeichnung")
            @inputText(barItemEditForm("stock"), '_label -> "Lagermenge")
            @select(
                barItemEditForm("distUnitId"),
                distUnits,
                '_label -> "Einheit"
            )

         @select(
                barItemEditForm("categoryId"),
                categories,
                '_label -> "Kategorie"

            )

导航到编辑视图时,我使用Form类的fill()方法填充表单:

 BarItem.findById(id).map {
      item =>
        Ok(html.edit(id, barItemEditForm.fill(item), DistUnit.selectOptions, Category.selectOptions))
 }.getOrElse(NotFound)

在处理表单提交的操作中,我将Form与请求绑定在一起,如下所示:

...
implicit request =>
      barItemEditForm.bindFromRequest.fold(
        formWithErrors => BadRequest(html.edit(id, formWithErrors, DistUnit.selectOptions, Category.selectOptions)),
        item => {
          ...updateStuff...
        }
      )
...

现在的问题是,由于我在视图中没有“initialAmount”的输入字段,因此从请求绑定时会出现错误,说它没有值。

以某种方式可能只应用来自请求的部分值并保持这个值之前的fill()调用吗?

或者任何人都可以建议一种正确的方法来处理这种“部分编辑”?

我真的很期待任何建议!

1 个答案:

答案 0 :(得分:0)

由于您希望保留该值,因此当您重新呈现表单时,这可能意味着隐藏的输入。如果先前的值来自其他地方,例如在数据库中,您可以为该字段定义另一个带有ignored映射的表单。