你好
我正在尝试为play应用程序的CRUD部分自定义list.html视图。

我的模特是这样的

我有一个与其他对象有关系的对象,如下所示:

@Entity
public class MyObjectA extends Model {

    @Required
    public String myObjectAName;

    ...

    @Required
    @ManyToOne
    public MyObjectB myObjectB;
}

现在在我压倒的list.html中,我有这个
<div id="crudListTable">
    #{crud.table fields:['myObjectB', 'myObjectAName'] /}
</div>

现在,执行此代码将在浏览器中调用以下网址http://myplayapp/admin/myObjectAs时显示类似以下内容

myObjectB __ myObjectAName

MyObjectB [1] __ 嘿,这是myObjectAName的名称
MyObjectB [2] __ 嘿,这是myObjectAName的另一个名称

注意MyObjectB在[]中使用对象名称和对象ID。

因此,要在上面的列表中显示MyObjectB的myObjectBName属性,请尝试以下操作:
<div id="crudListTable">
    #{crud.table fields:['myObjectB.myObjectBName', 'myObjectAName'] /}
</div>

但是然后我得到这个错误

模板{module:crud} /app/views/tags/crud/table.html中发生执行错误。 >引发的异常为MissingPropertyException:没有此类属性:myObjectB.myObjectBName>对于类:models.MyObjectA。

当然,MyObjectB具有公共属性myObjectBName

那么,我在这里做错了什么?

最佳答案

它不起作用,因为fields参数仅获取要显示的类的字段名称列表(此处为MyObjectA),而"myObjectB.myObjectBName"不是MyObjectA中的字段名称。

有两种方法可以做到这一点:

简单的解决方案是重写toString()MyObjectB方法。这样做的缺点是,每次显示MyObjectB时都使用相同的字符串,而这可能不是您想要的。

例:

public class MyObjectB extends Model {

  // ...

  @Override
  public String toString(() {
    return this.myObjectBName;
  }

}

列表特定的解决方案是使用 crud.custom tag

例:
#{crud.table fields:['myObjectB', 'myObjectAName']}
   #{crud.custom 'myObjectB'}
       ${object.myObjectB.myObjectBName}
   #{/crud.custom}
#{/crud.table}

07-24 13:48