Выезд boost.org . Это обеспечивает большую дополнительную функциональность, особенно их реализации интеллектуального указателя.
Вот как я в итоге сделал:
class UserProfileForm(forms.ModelForm):
first_name = forms.CharField(label=_(u'Prénom'), max_length=30)
last_name = forms.CharField(label=_(u'Nom'), max_length=30)
def __init__(self, *args, **kw):
super(UserProfileForm, self).__init__(*args, **kw)
self.fields['first_name'].initial = self.instance.user.first_name
self.fields['last_name'].initial = self.instance.user.last_name
self.fields.keyOrder = [
'first_name',
'last_name',
...some_other...
]
def save(self, *args, **kw):
super(UserProfileForm, self).save(*args, **kw)
self.instance.user.first_name = self.cleaned_data.get('first_name')
self.instance.user.last_name = self.cleaned_data.get('last_name')
self.instance.user.save()
class Meta:
model = UserProfile
Я считаю нормальным, что вы не найдете никакой информации в документации, когда вы объединяете две модели в единую форму.
В качестве альтернативы и, возможно, очень очевидно, вы можете: создать две формы модели, одну для пользователя, а другую - для профиля пользователя. Установите в форме профиля пользователя отображение только имени и фамилии. Поместите обе формы в один шаблон в один тег
. После отправки вызовите методы сохранения каждой формы.
Вот как я это сделал в текущем стволе (ревизия: 11804). Решение Natim у меня не работает.
В admin.py
:
class ProfileAdmin(admin.ModelAdmin):
form = ProfileForm
def save_model(self, request, obj, form, change):
obj.user.first_name = form.cleaned_data['first_name']
obj.user.last_name = form.cleaned_data['last_name']
obj.user.save()
obj.save()
В forms.py
:
class ProfileForm(forms.ModelForm):
first_name = forms.CharField(max_length=256)
last_name = forms.CharField(max_length=256)
def __init__(self, *args, **kwargs):
super(ProfileForm, self).__init__(*args, **kwargs)
try:
self.fields['first_name'].initial = self.instance.user.first_name
self.fields['last_name'].initial = self.instance.user.last_name
except User.DoesNotExist:
pass
class Meta:
fields = ['first_name', 'last_name', ...etc.]
Почему бы не иметь две модельные формы на серверной части и просто не представить их как одну форму в вашем шаблоне? Отбросьте поля имени из формы UserProfileForm и создайте вторую модельную форму для объекта пользователя?
Вы также можете попробовать использовать проект django-basic-apps, в котором есть приложение профилей:
Я наткнулся на это сегодня и после некоторого поиска в Google нашел решение, которое, на мой взгляд, немного чище:
#in forms.py
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ["username", "email"]
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
#in views.py
def add_user(request):
...
if request.method == "POST":
uform = UserForm(data = request.POST)
pform = UserProfileForm(data = request.POST)
if uform.is_valid() and pform.is_valid():
user = uform.save()
profile = pform.save(commit = False)
profile.user = user
profile.save()
....
...
#in template
<form method="post">
{{ uform.as_p }}
{{ pform.as_p }}
<input type="submit" ...>
</form>