Je viens de commencer à travailler avec Django après des années de Spring MVC et l'implémentation des formulaires semble être un peu folle. Si vous n'êtes pas familier, les formulaires Django commencent par une classe de modèle de formulaire qui définit vos champs. Spring commence également avec un objet de support de formulaire. Mais lorsque Spring fournit un taglib pour lier des éléments de formulaire à l'objet de support dans votre JSP, Django a des widgets de formulaire directement liés au modèle. Il existe des widgets par défaut où vous pouvez ajouter des attributs de style à vos champs pour appliquer du CSS ou définir des widgets entièrement personnalisés en tant que nouvelles classes. Tout va dans votre code python. Cela me semble dingue. Premièrement, vous mettez des informations sur votre vue directement dans votre modèle et deuxièmement, vous liez votre modèle à une vue spécifique. Suis-je en train de manquer quelque chose?
EDIT: Un exemple de code tel que demandé.
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'}))
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>