Резюме:
u = self.instance.user
in
def save(self, *args, **kwargs):
u = self.instance.user
u.first_name = self.cleaned_data['first_name']
u.last_name = self.cleaned_data['last_name']
u.save()
return super(ProfileForm, self).save(*args, **kwargs)
вызывает проблему, поскольку self.instance не существует.Но все же, как это делается в других примерах, где это, кажется, работает.Чего мне не хватает?
Читайте дальше для получения дополнительной информации ->
Я использую как django-registration, так и django-profile.В целях просто заставить его работать, я не добавил никаких дополнительных полей в модель профиля (которая расширяет Пользователь).Пока это выглядит так:
class sumaConnectUser(models.Model):
user = models.ForeignKey(User)
def __unicode__(self):
return self.user.first_name + " " + self.user.last_name
def get_absolute_url(self):
return ('profiles_profile_detail', (), { 'username': self.user.username })
get_absolute_url = models.permalink(get_absolute_url)
Насколько я понимаю, мой профиль пользователя должен включать поля, которые входят в модель contrib.auth Пользователь.(имя, фамилия и т. д.)
В своем urls.py я передаю свою пользовательскую форму для создания и редактирования профилей -
(r'^profiles/edit', 'profiles.views.edit_profile', {'form_class': ProfileForm, }),
(r'^profiles/create', 'profiles.views.create_profile', {'form_class': ProfileForm, }),
(r'^profiles/', include('profiles.urls')),
Наконец, вот мой профильform-
from suma.sumaconnect.models import sumaConnectUser
from django import forms
from django.contrib.auth.models import User
class ProfileForm(forms.ModelForm):
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
first_name = forms.CharField(label="First Name")
last_name = forms.CharField(label="Last Name")
class Meta:
exclude = ('user',)
model = sumaConnectUser
def save(self, *args, **kwargs):
u = self.instance.user
u.first_name = self.cleaned_data['first_name']
u.last_name = self.cleaned_data['last_name']
u.save()
return super(ProfileForm, self).save(*args, **kwargs)
Моя цель - позволить пользователю редактировать свое имя и фамилию в рамках редактирования профиля, но не имя пользователя и пароль.
Я думал о замене
u = self.instance.user
с
u = User.objects.get(user = self.cleaned_data['username'])
, но для этого потребуется, чтобы я добавил username = forms.CharField на страницу, которую я не хочу отображать.Насколько я понимаю, когда я захожу на страницу создания профиля или редактирования профиля, я должен автоматически редактировать профиль, связанный с пользователем, в который я вошел как.
К тому времени, когда я прихожу к этому созданиюили отредактируйте страницу пользователя, модель пользователя уже существует, но профиль не существует.Это причина проблемы?Я думаю, что я неправильно понимаю что-то важное, и я был бы очень признателен за любые указания относительно того, где я иду не так.Спасибо!