2013-01-15 38 views
6

Tôi có biểu mẫu với 2 trường - empnoname. Cả hai đều lấp đầy với giá trị mặc định. Khi hiển thị trong chế độ xem, tôi muốn empno là chỉ đọc và name có thể chỉnh sửa được.Cách tạo trường chỉ đọc trong Chế độ xem

Tạo chế độ xem, tôi đang sử dụng @leaveform.value.get.empno để hiển thị tiền phạt chỉ hoạt động và làm việc. Vấn đề chỉ xảy ra trong quá trình chèn với lỗi ([NoSuchElementException: None.get]).

Câu hỏi:

  1. Vấn đề là lỗi trả lại không có tài sản giá trị. Tôi có thể sử dụng những gì khác để có được giá trị?
  2. Tôi có thể bỏ qua @inputText cho trường chỉ đọc không?

Tham khảo bên dưới mã của tôi:

// ***** 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")) 
     } 

Trả lời

15

Nó không phải là bắt buộc phải sử dụng người giúp mẫu. Nếu bạn sử dụng chúng, bạn có thể chuyển thuộc tính readonly hoặc tạo kiểu cho trường bằng CSS để làm cho nó trông chỉ đọc.

  • Twitter bootstrap vô hiệu hóa bởi CSS:

    @inputText(
        editForm("createdOn"), 
        'id -> "createdOn", 
        'class -> "input-xlarge disabled", 
        '_label -> Messages("createdOn"), 
        '_help -> "" 
    ) 
    
  • đèo tùy chọn thuộc tính: readonly

    @inputText(
        editForm("createdOn"), 
        'id -> "createdOn", 
        'class -> "input-xlarge", 
        '_label -> Messages("createdOn"), 
        'readonly -> "readonly", 
        '_help -> " This is read only" 
    ) 
    
  • Bạn cũng có thể không gửi lại lĩnh vực này, nhưng hiển thị giá trị của nó:

    <span class="date">Created on: @editForm("createdOn").value</span> 
    
  • Cập nhật 2018-01-24

lĩnh vực Play hiện đã được trả lại một Optional, see the docs. Điều này có nghĩa bạn có thể nhận được giá trị từ các lĩnh vực như:

  • @form("fieldName").getValue.get (có thể ném một NPE)
  • @form("fieldName").getValue.getOrElse("defaultValue")
+0

Tôi đang sử dụng scala 2.0.3 và th ere không có phương pháp trường. Mã của tôi -> trường hợp '@ leaveform.field ("trạng thái"). Giá trị' và lỗi trả về 'không phải là thành viên của play.api.data.Form [models.LeaveModel]'. –

+0

hmm .. Tôi đang sử dụng java, nhưng các tài liệu nói: Bạn cũng có quyền truy cập vào trường gốc bằng cách sử dụng @ elements.field: http://www.playframework.org/documentation/2.0/ScalaFormHelpers. – adis

+0

@SimonSiah cố gắng sử dụng '@ leaveform (" trạng thái ") .giá trị' thay vào đó, tôi không có kinh nghiệm với các hình thức Scala, dù sao mà nên làm việc. – biesior

0

Hãy thử sử dụng bối cảnh Flash khi trở về một hình thức cho người sử dụng:

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

Mã này hoạt động tốt trong quá trình tạo biểu mẫu và trả lại lỗi. @ leaveform.forField ("name") (giá trị => value.value.get). Cảm ơn vì sự giúp đỡ của các bạn. –

Các vấn đề liên quan