Właśnie zacząłem pracować z Django pochodzącym z lat Spring MVC, a implementacja formularzy wydaje się nieco szalona. Jeśli nie jesteś zaznajomiony, formularze Django zaczynają się od klasy modelu formularza, która definiuje twoje pola. Wiosna podobnie zaczyna się od obiektu opartego na formularzu. Ale tam, gdzie Spring udostępnia taglib do wiązania elementów formularza do obiektu podkładu w JSP, Django ma widżety formularzy powiązane bezpośrednio z modelem. Istnieją domyślne widżety, w których można dodać atrybuty stylu do pól w celu zastosowania CSS lub zdefiniować całkowicie niestandardowe widżety jako nowe klasy. Wszystko idzie w kodzie Pythona. To wydaje mi się szalone. Po pierwsze, umieszczasz informacje o swoim widoku bezpośrednio w swoim modelu, a po drugie wiążesz swój model z określonym widokiem. Czy coś brakuje?
EDYCJA: Niektóre przykładowy kod na żądanie.
Django:
# 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'}))
Wiosna 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>