如何将session变量传递给play framework / scala中的表单以存储在数据库中

问题描述 投票:1回答:1

以下是我的表单提交页面。 author变量是我想要从登录用户中获取的变量,因为它是我需要与其余输入一起放入数据库的数据的一部分。我想知道如何在登录用户的此实例中获取用户名并将其传递到作者字段,而无需用户自己输入。

@(itemForm: Form[models.SubmittedWork],user: models.users.User)

@import helper._

@main("Add submission",user){
    <p class="lead">Add a new submission</p>

    @form(action=routes.HomeController.addSubmissionSubmit(), 'class -> "form-horizontal", 'role -> "form") {
        @* CSRF attack prevention *@
        @* This token, sent by the controller, will be used to authenticate the form submission *@
        @CSRF.formField

            @inputText(itemForm("name"), '_label -> "Name", 'class -> "form-control")
            @select(
                itemForm("Genre.id"),
                options(Genre.options),
                '_label -> "Genre", '_default -> "-- Choose a Genre --", 
                '_showConstraints -> false, 'class -> "form-control"
            )
            @inputText(itemForm("text"), '_label -> "Text", 'class -> "form-control")

            @inputText(itemForm("id"), '_label -> "", 'hidden -> "hidden")
            @inputText(itemForm("author"),'_label -> "", 'hidden -> "hidden")

            <div class="actions">
                <input type="submit" value="Add/Update item" class="btn btn-primary">
                <a href="@routes.HomeController.works(0)">
                    <button type="button" class="btn btn-warning">Cancel</button>
                </a>
            </div>
    } @* end of form *@
} @* end of main *@
html scala playframework
1个回答
1
投票

您只需通过控制器连接即可。

  def myView(): Action[AnyContent] = Action { implicit req =>
    val userId = req.session("user_id")
    val user = findUser(userId)
    Results.Ok(views.yourForm(itemForm, user))
  }

然后在你看来:

<p class="username">${user.name}</p>

findUser方法或其他任何方法允许您根据请求中的某种数据搜索user。如果用户没有潜在登录,req.session(key)将返回null,因此您可能需要更换Option[User]

关键是您可以将任何变量传递给表单,并使用@{variable.field}语法显示您喜欢的任何内容。 Twirl语法允许您执行此操作,以及集合上的循环,以便为每个元素等创建div。

快速阅读Twirl Syntax,它应该可以帮助您查看它可以做的所有示例。要“获取数据”,通常最好将逻辑放在控制器中,并将其传递给视图。

© www.soinside.com 2019 - 2024. All rights reserved.