我有两个模型Movie
和Place
之间的映射。
当我现在创建一个来自movieForm
并填写已创建的Movie
然后打开一个包含movieForm
所有文本字段和选择字段的视图时,填充除{{1}之外的值到Place
。
在下面的示例中,在视图中的“选择”中正确选择了类别,但未选择该位置。
可能是什么问题? 我该如何解决这个问题?
Movie
@Entity
public class Movie extends Model {
@Id
public Long id;
...
@Required
@Formats.NonEmpty
public EnumCategorie categorie = EnumCategorie.FILM;
@ManyToOne
public Place place;
...
}
@Entity
public class Place extends Model {
@Id
public String name;
...
}
public class Movies extends Controller {
public static Result edit(Long id) {
Movie movie = Movie.find.byId(id);
Form<Movie> movieForm = form(Movie.class).fill(movie);
return ok(movieCreate.render(movieForm,
placeForm, "edit"));
}
答案 0 :(得分:0)
我猜你错过了Place.java
模型上的这行代码。该模型可能如下所示:
@Entity
public class Place extends Model {
@Id
public String name;
... // the rest of fields
// Sample of all Places data as value of select option in views
public static List<String> places() {
List<String> all = new ArrayList<>();
all.add("INA"); // Place.name = "INA"
all.add("BEL"); // Place.name = "BEL"
all.add("KOR"); // Place.name = "KOR"
return all;
}
// You missed this
public String toString() {
return name; // return Place.name
}
}
好的,现在这是解释。让我们看看您的视图代码:
@select(movieForm("place"), options(Place.places), ...)
options(...)
仅适用于以下数据类型(取自play2源代码):
def apply(options: (String, String)*) = ...
def apply(options: Map[String, String]) = ...
def apply(options: java.util.Map[String, String]) = ...
def apply(options: List[String]) = ...
def apply(options: java.util.List[String]) = ...
因为Movie
类上的地点字段是Place
对象而不是String
对象,所以它应该表示为String
。您可以定义它的方法是覆盖toString()
对象上的Place
方法,因此它代表Place.name
模型{ {<1}}模型的ID )作为视图中选择选项的值(指使用Place
填充的数据)。
希望这有助于解决您的问题。
如果我们选择不覆盖模型上的Place.places()
方法,我们也可以执行以下操作:
toString()
`@select(movieForm("place.name"), options(Place.places), ...)`
可用于绑定movieForm("place.name")
对象,其ID值可直接输入值。 This related question可以作为此解决方案的参考。