2013-01-15 66 views
6

我有一個包含2個字段的表單 - empnoname。兩者都填滿了默認值。當顯示在視圖中時,我想empno是隻讀的,name是可編輯的。如何在視圖中創建只讀字段

在視圖創建中,我使用@leaveform.value.get.empno來顯示ready-only並正常工作。該問題僅在插入過程中發生,出現錯誤([NoSuchElementException: None.get])

問題:

  1. 問題是返回錯誤不具有價值屬性。我還能用什麼來獲得價值?
  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")) 
     } 

回答

15

不強制使用表單助手。如果使用它們,則可以傳遞屬性readonly或使用CSS對字段進行樣式設置,使其看起來只讀。

  • Twitter的引導通過CSS禁用:

    @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年1月24日

遊戲領域正在返回Optionalsee the docs。這意味着你可以從像場中獲得的價值:

  • @form("fieldName").getValue.get(可以拋出一個NPE
  • @form("fieldName").getValue.getOrElse("defaultValue")
+0

我正在使用scala 2.0.3和th ere不是現場方法。我的代碼 - >'@ leaveform.field(「status」).value'和return error'value字段不是play.api.data.Form [models.LeaveModel]'的成員。 –

+0

嗯..我使用java,但文檔說:您還可以使用@ elements.field訪問原始字段:http://www.playframework.org/documentation/2.0/ScalaFormHelpers。 – adis

+0

@SimonSiah嘗試使用'@leaveform(「status」).value',我沒有使用Scala Forms的經驗,無論如何應該工作。 – biesior

0

嘗試使用返回形式提供給用戶,當閃存上下文:

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,Erich

+0

此代碼在表單創建過程中運行良好並返回錯誤。 @ leaveform.forField(「name」)(value => value.value.get)。感謝所有幫助的人。 –

相關問題