|
|
@@ -240,15 +240,8 @@ Profile = get_profile_class()
|
|
240
|
240
|
if Profile:
|
|
241
|
241
|
|
|
242
|
242
|
class UserAndProfileForm(forms.ModelForm):
|
|
243
|
|
- first_name = forms.CharField(
|
|
244
|
|
- label=_('First name'), max_length=128, required=False)
|
|
245
|
|
- last_name = forms.CharField(
|
|
246
|
|
- label=_('Last name'), max_length=128, required=False)
|
|
247
|
243
|
email = forms.EmailField(label=_('Email address'), required=True)
|
|
248
|
244
|
|
|
249
|
|
- # Fields from user model
|
|
250
|
|
- user_fields = ('first_name', 'last_name', 'email')
|
|
251
|
|
-
|
|
252
|
245
|
def __init__(self, user, *args, **kwargs):
|
|
253
|
246
|
self.user = user
|
|
254
|
247
|
try:
|
|
|
@@ -260,17 +253,34 @@ if Profile:
|
|
260
|
253
|
|
|
261
|
254
|
super(UserAndProfileForm, self).__init__(*args, **kwargs)
|
|
262
|
255
|
|
|
263
|
|
- # Add user fields
|
|
264
|
|
- self.fields['first_name'].initial = self.instance.user.first_name
|
|
265
|
|
- self.fields['last_name'].initial = self.instance.user.last_name
|
|
|
256
|
+ # Get a list of profile fields to help with ordering later
|
|
|
257
|
+ profile_field_names = self.fields.keys()
|
|
|
258
|
+ del profile_field_names[profile_field_names.index('email')]
|
|
|
259
|
+
|
|
266
|
260
|
self.fields['email'].initial = self.instance.user.email
|
|
267
|
261
|
|
|
268
|
|
- # Ensure user fields are above profile
|
|
269
|
|
- order = list(self.user_fields)
|
|
270
|
|
- for field_name in self.fields.keys():
|
|
271
|
|
- if field_name not in self.user_fields:
|
|
272
|
|
- order.append(field_name)
|
|
273
|
|
- self.fields.keyOrder = order
|
|
|
262
|
+ # Add user fields (we look for core user fields first)
|
|
|
263
|
+ core_field_names = set([f.name for f in User._meta.fields])
|
|
|
264
|
+ user_field_names = ['email']
|
|
|
265
|
+ for field_name in ('first_name', 'last_name'):
|
|
|
266
|
+ if field_name in core_field_names:
|
|
|
267
|
+ user_field_names.append(field_name)
|
|
|
268
|
+ user_field_names.extend(User._meta.additional_fields)
|
|
|
269
|
+
|
|
|
270
|
+ # Store user fields so we know what to save later
|
|
|
271
|
+ self.user_field_names = user_field_names
|
|
|
272
|
+
|
|
|
273
|
+ # Add additional user fields
|
|
|
274
|
+ additional_fields = forms.fields_for_model(
|
|
|
275
|
+ User, fields=user_field_names)
|
|
|
276
|
+ self.fields.update(additional_fields)
|
|
|
277
|
+
|
|
|
278
|
+ # Set initial values
|
|
|
279
|
+ for field_name in user_field_names:
|
|
|
280
|
+ self.fields[field_name].initial = getattr(user, field_name)
|
|
|
281
|
+
|
|
|
282
|
+ # Ensure order of fields is email, user fields then profile fields
|
|
|
283
|
+ self.fields.keyOrder = user_field_names + profile_field_names
|
|
274
|
284
|
|
|
275
|
285
|
class Meta:
|
|
276
|
286
|
model = Profile
|
|
|
@@ -290,10 +300,12 @@ if Profile:
|
|
290
|
300
|
|
|
291
|
301
|
def save(self, *args, **kwargs):
|
|
292
|
302
|
user = self.instance.user
|
|
293
|
|
- user.first_name = self.cleaned_data['first_name']
|
|
294
|
|
- user.last_name = self.cleaned_data['last_name']
|
|
295
|
|
- user.email = self.cleaned_data['email']
|
|
|
303
|
+
|
|
|
304
|
+ # Save user also
|
|
|
305
|
+ for field_name in self.user_field_names:
|
|
|
306
|
+ setattr(user, field_name, self.cleaned_data[field_name])
|
|
296
|
307
|
user.save()
|
|
|
308
|
+
|
|
297
|
309
|
return super(ProfileForm, self).save(*args, **kwargs)
|
|
298
|
310
|
|
|
299
|
311
|
ProfileForm = UserAndProfileForm
|