要点:
u = self.instance.user
在
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-profiles。为了使其正常工作,我没有向配置文件模型添加任何额外的字段(扩展用户的字段)。到目前为止它看起来像这样:
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')),
最后,这是我的个人资料表格 -
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。据我所知,当我来创建配置文件或编辑个人资料页面时,我应该自动编辑与我登录的用户关联的配置文件。
当我来创建或编辑用户页面时,用户模型已经存在,但配置文件却没有。这是问题的原因吗?我想我误解了一些重要的事情,我非常感谢任何关于我哪里出错的指示。谢谢!
答案 0 :(得分:0)
如果您愿意,可以复制字段,并按上述方式对其进行双重更新,但这不是配置文件的目的。它应该处理不在原始auth.User中的字段,因为您不需要直接编辑该模型。你上面提到“扩展用户” - 你实际上并没有继承auth.User,不是吗?我强烈建议不要这样做。
更新
见this reference material。它使用与您相同的语法在配置文件中进行用户更新。
更新2:
示例适用于编辑个人资料,而非创建个人资料。查看profile.views.create_profile中的代码:
if request.method == 'POST':
form = form_class(data=request.POST, files=request.FILES)
if form.is_valid():
profile_obj = form.save(commit=False)
profile_obj.user = request.user
profile_obj.save()
因此,首先保存表单 ,然后设置用户,然后保存个人资料。
这意味着您无法在form.save中设置用户值,您需要在配置文件的model.save中执行此操作:
# in sumaConnectUser:
from django.db.models.base import ObjectDoesNotExist
class sumaConnectUser(models.Model):
...
def save( self, *args, **kwargs ):
s = super(sumaConnectUser,self).save( *args, **kwargs )
try:
u = s.user
u.first_name = self.first_name
u.last_name = self.last_name
u.save()
except ObjectDoesNotExist:
pass
return s
基本上,通过查看profile.views.create_profile中的代码,我们肯定 它设置了user
。这可能不是第一次,所以我们需要陷入这种情况而忘记它。因为最终,它会被调用并触发我们的保存到用户代码。结果是,无论您将来使用此用户配置文件的形式如何,它总是会保存回基础用户。