2013-01-15 19 views
6

में केवल पढ़ने के लिए फ़ील्ड कैसे बनाएं मेरे पास 2 फ़ील्ड - empno और name के साथ एक फॉर्म है। दोनों डिफ़ॉल्ट मान के साथ भरें। जब दृश्य में प्रदर्शित होता है, तो मुझे empno केवल पढ़ने के लिए और name संपादन योग्य है।देखें

निर्माण में, मैं केवल तैयार और काम ठीक करने के लिए @leaveform.value.get.empno का उपयोग कर रहा हूं। समस्या केवल ([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 विशेषता को पास कर सकते हैं या सीएसएस के साथ क्षेत्र को स्टाइल कर सकते हैं ताकि इसे केवल पढ़ने के लिए बनाया जा सके।

  • ट्विटर बूटस्ट्रैप सीएसएस रूप से अक्षम:

    @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

प्ले खाना अब Optional, see the docs लौटा रहा है। इसका मतलब है आप की तरह मैदान से मूल्य प्राप्त कर सकते हैं:

  • @form("fieldName").getValue.get (फेंक कर सकते हैं एक NPE)
  • @form("fieldName").getValue.getOrElse("defaultValue")
+0

मैं स्केला 2.0.3 और वें उपयोग कर रहा हूँ अयस्क कोई फील्ड विधि नहीं है। मेरा कोड -> '@ leaveform.field ("स्थिति")। मान' और वापसी त्रुटि 'मान फ़ील्ड play.api.data.Form [model.LeaveModel]' का सदस्य नहीं है। –

+0

हम्म .. मैं जावा का उपयोग कर रहा हूं, लेकिन दस्तावेज़ कहते हैं: आपके पास @ elements.field का उपयोग करके मूल फ़ील्ड तक पहुंच है: http://www.playframework.org/documentation/2.0/ScalaFormHelpers। – adis

+0

@ सिमोनियाह '@ लेवफॉर्म ("स्थिति") का उपयोग करने का प्रयास करें। इसके बजाय मूल्य, मुझे स्कैला फॉर्म के साथ कोई अनुभव नहीं है, वैसे भी जो काम करना चाहिए। – 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, एरिक

+0

यह कोड फ़ॉर्म निर्माण और वापसी त्रुटि के दौरान अच्छी तरह से काम करता है। @ leaveform.forField ("name") (value => value.value.get)। आपकी इतनी मदद के लिए आपका धन्यवाद दोस्तों। –

संबंधित मुद्दे