2013-01-15 10 views
6

Mam formularz z 2 polami - empno i name. Oba zapełniają się wartością domyślną. Podczas wyświetlania chcę, aby empno był tylko do odczytu, a edycja name.Jak utworzyć pole tylko do odczytu w widoku

Podczas tworzenia widoku używam @leaveform.value.get.empno do wyświetlania tylko gotowego i działa poprawnie. Problem występuje tylko podczas wstawiania z błędem ([NoSuchElementException: None.get]).

Pytania:

  1. problem jest powrót błąd nie posiada właściwość wartość. Co jeszcze mogę użyć, aby uzyskać wartość? Czy można pominąć dla pola tylko do odczytu?

Patrz poniżej mojego kodu:

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

Odpowiedz

15

nie jest obowiązkowe do korzystania z formularza pomocników. Jeśli ich użyjesz, możesz przekazać atrybut readonly lub zmienić styl przy pomocy CSS, aby wyglądał tylko do odczytu.

  • Twitter Bootstrap wyłączona przez CSS:

    @inputText(
        editForm("createdOn"), 
        'id -> "createdOn", 
        'class -> "input-xlarge disabled", 
        '_label -> Messages("createdOn"), 
        '_help -> "" 
    ) 
    
  • Przełęcz opcjonalny atrybut: readonly

    @inputText(
        editForm("createdOn"), 
        'id -> "createdOn", 
        'class -> "input-xlarge", 
        '_label -> Messages("createdOn"), 
        'readonly -> "readonly", 
        '_help -> " This is read only" 
    ) 
    
  • Można również nie ponowne boiska, ale wyświetla wartość:

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

play pole jest teraz zwrócenie Optional, see the docs. Oznacza to, że można uzyskać wartość z pola jak:

  • @form("fieldName").getValue.get (może rzucić NPE)
  • @form("fieldName").getValue.getOrElse("defaultValue")
+0

Używam Scala 2.0.3 i th ere nie jest metodą polową. Mój kod -> pole "leaveform.field (" status "). Wartość" i błąd powrotu "nie jest członkiem play.api.data.Form [models.LeaveModel]". –

+0

hmm .. Używam java, ale doktorzy mówią: Masz również dostęp do oryginalnego pola przy użyciu @ elements.field: http://www.playframework.org/documentation/2.0/ScalaFormHelpers. – adis

+0

@SimonSiah spróbuj użyć '@leaveform (" status "). Value" zamiast tego, nie mam doświadczenia z Scala Forms, w każdym razie to powinno działać. – biesior

0

Spróbuj użyć kontekst Flash po powrocie formularz do użytkownika:

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

Ten kod działa dobrze podczas tworzenia formularza i błędu powrotu. @ leaveform.forField ("name") (value => value.value.get). Dzięki za wszystkich pomocników. –

Powiązane problemy