【问题标题】:play.data.Form - How best to fill default form valuesplay.data.Form - 如何最好地填写默认表单值
【发布时间】:2014-09-14 02:10:35
【问题描述】:

尝试将过滤器表单添加到标准的 crud 'list' 页面。

// set filter defaults
ImageFilter defaultFilter = new ImageFilter();
defaultFilter.setYear(currentYear);
defaultFilter.setColor(user.getFavouriteColor());

// get filter for view
Form<ImageFilter> form = Form.form(ImageFilter.class).fill(defaultFilter).bindFromRequest();
ImageFilter filter = form.get()
  • bindFromRequest() 单独获取带有用户指定过滤器的表单,但在首次加载时字段没有选定值
  • fill(defaultFilter) 单独提供了一个选择了默认过滤器的表单
  • 以这种方式链接的行为与最后调用的行为完全相同。

设置默认值的适当方法是什么?

理想情况下,在索引页面上:

  • 未给定任何参数时的默认过滤器选择
  • 如果使用 ?year=2010&color=blue 请求,这些过滤器会显示在表单上
  • 如果使用 ?year=2010 请求,表单将显示 2010 年和用户最喜欢的颜色

【问题讨论】:

  • 我的实际用例有 10 个左右可能的过滤器,这只是应用程序中众多模型中的第一个。真的希望有一个单一的解决方案。 (刚刚来自 Python/Django 项目,Java/Play 相当冗长)

标签: java forms playframework default-value playframework-2.2


【解决方案1】:

检查是否存在默认值,然后顺其自然。 如果不存在,请将其添加到过滤器中或使用查询字符串参数在 UI 上呈现。

【讨论】:

    【解决方案2】:

    您可以通过将代码分成两个动作来实现您想要的。

    在第一个中,您使用默认过滤器填写表单并将其显示给用户。

    public static Result show() {
        ImageFilter defaultFilter = new ImageFilter();
        defaultFilter.setYear(currentYear);
        defaultFilter.setColor(user.getFavouriteColor());
        Form<ImageFilter> form = Form.form(ImageFilter.class).fill(defaultFilter);
    
        return ok(index.render(form));
    }
    

    在第二个动作中,您只需绑定来自请求的表单值。如果用户更改了一些值,表单将与它们一起填充,未更改的设置为默认值。

    public static Result handle() {
        Form<ImageFilter> form = Form.form(ImageFilter.class).bindFromRequest();
        ImageFilter filter = form.get();
        return ok("TODO handle form");
    }
    

    编辑

    如果您想在用户输入后用默认值填充缺失的字段,而不在提交前在视图中显示它们,恐怕您必须在绑定后手动完成。

    【讨论】:

    • 我确实玩过并得出了类似的方法。只需检查查询字符串(if (request().queryString().size() == 0) .fill(...) else .bindFromRequest()
    • 这确实有效(排序),但它是一个非此即彼的......它不会支持我的问题结束时我的“理想”的第 3 点
    • 如果您不允许在用户请求之前填写默认值,那么播放表单 API 将无法帮助您。在这种情况下,您所能做的就是检查哪个字段未填写并使用 setter 设置默认值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多