私は、長年のSpring MVCから来たDjangoと仕事を始めたばかりで、フォームの実装は少しおかしいと感じています。慣れていない場合、Djangoフォームは、フィールドを定義するフォームモデルクラスから始まります。同様に、Springはフォームをバッキングするオブジェクトから始まります。ただし、Springがフォーム要素をJSP内のバッキングオブジェクトにバインドするためのtaglibを提供している場合、Djangoにはモデルに直接関連付けられたフォームウィジェットがあります。CSSを適用したり、完全にカスタムウィジェットを新しいクラスとして定義するためにフィールドにスタイル属性を追加できるデフォルトのウィジェットがあります。それはすべてあなたのpythonコードに含まれています。それは私には馬鹿げているようです。最初に、ビューに関する情報をモデルに直接入力し、次にモデルを特定のビューにバインドします。何か不足していますか?
編集:要求されたいくつかのサンプルコード。
ジャンゴ:
# Class defines the data associated with this form
class CommentForm(forms.Form):
# name is CharField and the argument tells Django to use a <input type="text">
# and add the CSS class "special" as an attribute. The kind of thing that should
# go in a template
name = forms.CharField(
widget=forms.TextInput(attrs={'class':'special'}))
url = forms.URLField()
# Again, comment is <input type="text" size="40" /> even though input box size
# is a visual design constraint and not tied to the data model
comment = forms.CharField(
widget=forms.TextInput(attrs={'size':'40'}))
Spring MVC:
public class User {
// Form class in this case is a POJO, passed to the template in the controller
private String firstName;
private String lastName;
get/setWhatever() {}
}
<!-- JSP code references an instance of type User with custom tags -->
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!-- "user" is the name assigned to a User instance -->
<form:form commandName="user">
<table>
<tr>
<td>First Name:</td>
<!-- "path" attribute sets the name field and binds to object on backend -->
<td><form:input path="firstName" class="special" /></td>
</tr>
<tr>
<td>Last Name:</td>
<td><form:input path="lastName" size="40" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Save Changes" />
</td>
</tr>
</table>
</form:form>