6

2つのフィールドを持つフォームがあります-empnoname。どちらもデフォルト値でいっぱいになります。ビューに表示する場合、empno読み取り専用でname編集可能です。

ビューの作成では、@leaveform.value.get.empnoready-onlyを表示し、正常に動作するために使用しています。この問題は、エラーのある挿入中にのみ発生します([NoSuchElementException: None.get])

質問:

  1. 問題は、戻りエラーにvalueプロパティがないことです。値を取得するために他に何を使用できますか?
  2. @inputText読み取り専用フィールドをスキップできますか?

以下の私のコードを参照してください:

// ***** CONTROLLER *****//

val leaveform = Form[LeaveModel](
      mapping(
          "empno" -> nonEmptyText,
          "name" -> nonEmptyText
      )((no, empno) => LeaveModel(empno, name))
      ((leave: LeaveModel) => Some(leave.empno, leave.name))
)

def create = withAuth { username => implicit request =>

  // Define default values
  val empno = "STUDENT"
  val name = ""

  // Set default values
  val filledForm = leaveform.fill(LeaveModel(empno,name))
  Ok(html.leave.form(filledForm))
}

def insert = Action (
    implicit request => {
        leaveform.bindFromRequest.fold(
            error => {
                BadRequest(html.leave.form(error)) // Question 1. Here is the error.
            },
            leave => {
               LeaveModel.insert(leave)
               Redirect(routes.indexController.index())
            }
        )  
      }
  )

// ***** VIEW START***** //
@(leaveform: Form[LeaveModel])
@leaveform.value.get.empno
@helper.form(
    action = (routes.LeaveController.update(oid)),
        'id -> "leaveform") {
            @inputText(leaveform("empno")) // Question 2. 
            @inputText(leaveform("name"))
        }
4

2 に答える 2

16

フォーム ヘルパーの使用は必須ではありません。それらを使用する場合は、属性を渡すreadonlyか、CSS でフィールドをスタイルして、読み取り専用に見せることができます。

  • CSS によって無効化された Twitter ブートストラップ:

    @inputText(
        editForm("createdOn"), 
        'id -> "createdOn", 
        'class -> "input-xlarge disabled", 
        '_label -> Messages("createdOn"), 
        '_help -> ""
    )
    
  • オプションの属性を渡します:readonly

    @inputText(
        editForm("createdOn"), 
        'id -> "createdOn", 
        'class -> "input-xlarge", 
        '_label -> Messages("createdOn"), 
        'readonly -> "readonly", 
        '_help -> " This is read only"
    )
    
  • フィールドを再送信せずに、その値を表示することもできます。

    <span class="date">Created on: @editForm("createdOn").value</span>
    
  • 2018-01-24 更新

Play フィールドは を返すようになりました。ドキュメントOptionalを参照してください。これは、次のようにフィールドから値を取得できることを意味します。

  • @form("fieldName").getValue.get( を投げることができますNPE)
  • @form("fieldName").getValue.getOrElse("defaultValue")
于 2013-01-15T19:53:15.343 に答える
0

ユーザーにフォームを返すときに、Flash コンテキストを使用してみてください。

def create = withAuth { username => implicit request =>
        // leaveForm initialization as before

        // use form data from flash if present
        val form = if (flash.get("error").isDefined)
            leaveForm.bind(flash.data)
        else
            leaveForm
        Ok(stakeholders.register(form))
}

def insert = Action { implicit request =>
        leaveForm.bindFromRequest.fold(
                hasErrors = { form =>
                    Redirect(routes.Leaves.create).  // put correct route here
                        flashing(Flash(form.data) +
                            ("error" -> Messages("validation.errors"))) // customize error message
                },
                leave => {
                    LeaveModel.insert(leave)
                    Redirect(routes.indexController.index())
            }
        )
    }

HTH、エーリッヒ

于 2013-01-17T09:27:18.877 に答える