@@ -97,8 +97,102 @@ If slugs do not make sense, instead use a CRC algorithm.::
97
97
import zlib
98
98
#Use permalink in real case
99
99
return '/customer/%s/' % zlib.crc32(self.pk)
100
+
101
+ Prefer ModelForm to Form
102
+ --------------------------
103
+ ModelForm already know the correct UI widgets for your underlying Models. In
104
+ most of the cases ModelForm would suffice instead of Forms.
105
+
106
+ Some common scnarios
107
+
108
+ Hiding some fields from ModelForm which are needed for a DB save.
109
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
110
+
111
+ Eg, you want too create a profile for the logged in user.::
112
+
113
+ #in Forms.py
114
+ class ProfileForm(forms.ModelForm):
115
+ class Meta:
116
+ model = Profile
117
+ exclude =['user',]
118
+
119
+ #In Views:
120
+ form = ProfileForm(request.POST)
121
+ profile = form.save(commit = False)
122
+ profile.user = request.user
123
+ profile.save()
124
+
125
+ Or::
126
+
127
+ #Todo test this
128
+ class ProfileForm(forms.ModelForm):
129
+ class Meta:
130
+ model = Profile
131
+ exclude =['user',]
132
+ def __init__(self, user, *args, **kwargs)
133
+ self.user = user
134
+ super(ProfileForm, self).__init__(*args, **kwargs)
135
+
136
+ def save(*args, **kwargs):
137
+ self.instance.user = self.user
138
+ super(ProfileForm, self).save(*args, **kwargs)
139
+
140
+ Saving multiple Objects in one form
141
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
142
+
143
+ As::
144
+
145
+ class ProfileForm(forms.ModelForm):
146
+ class Meta:
147
+ model = Profile
148
+ exclude =['user',]
149
+
150
+ class UserForm(forms.ModelForm):
151
+ class Meta:
152
+ model = User
153
+ exclude =[...]
154
+
155
+ #in views.py
156
+ userform = UserForm(request.POST)
157
+ profileform = ProfileForm(request.POST)
158
+ if userform.is_valid() and profileform.is_valid():
159
+ #Only if both are valid together
160
+ user = userform.save()
161
+ profile = profileform.save(commit = False)
162
+ profile.user = user
163
+ profile.save()
164
+
165
+ {# In templates #}
166
+ <form ...>
167
+ {{ userform }}
168
+ {{ profileform }}
169
+ <input type="submit" />
170
+ </form>
100
171
101
172
102
173
174
+
175
+ Forms should know how to save themselves.
176
+ ---------------------------------------------
177
+ if your forms is a forms.ModelForm, it already knows how to save its data. If you
178
+ write a forms.Form, it should have a `.save()`. This keeps things symmetrical with
179
+ `ModelForms`, and allows you to do::
180
+
181
+ #in views.py
182
+ def view_func(request):
183
+ if request.method == 'POST':
184
+ form = FormClass(request.POST)
185
+ if form.is_valid():
186
+ obj = form.save()
187
+ ...
188
+ ...
189
+
190
+ Instead of::
191
+
192
+ if form.is_valid():
193
+ #handle the saving in DB inside of views.
194
+
195
+ The `.save()` should return a Model Object
196
+
103
197
104
198
0 commit comments