摘要:
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)
我的理解是截至目前,我的用户“profile”应该只包含contrib.auth模型User附带的字段 . (名字,姓氏等)
在我的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')),
最后,这是我的 Profiles 表格 -
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)
我的目标是允许用户编辑他们的名字和姓氏作为 Profiles 编辑的一部分,但不是他们的用户名和密码 .
我考虑过更换
u = self.instance.user
同
u = User.objects.get(user = self.cleaned_data['username'])
但是这需要我在页面上包含一个我不想显示的username = forms.CharField . 据我所知,当我来创建配置文件或编辑配置文件页面时,我应该自动编辑与我登录的用户关联的配置文件 .
当我来创建或编辑用户页面时,用户模型已经存在,但配置文件却不存在 . 这是问题的原因吗?我认为我误解了一些重要的事情,我非常感谢任何关于我哪里出错的指示 . 谢谢!
1 回答
您可以根据需要复制字段,并按上述方式对其进行双重更新,但这不是配置文件的用途 . 它应该处理不在原始auth.User中的字段,因为您不需要直接编辑该模型 . 你上面提到“扩展用户” - 你实际上并没有继承auth.User,不是吗?我强烈建议不要这样做 .
更新:
见this reference material . 它使用与您相同的语法在配置文件中进行用户更新 .
更新2:
该示例适用于 edit profile ,而不是创建配置文件 . 查看profile.views.create_profile中的代码:
因此它首先保存表单,然后设置 user ,然后保存配置文件 .
这意味着您无法在form.save中设置用户值,您需要在配置文件的model.save中执行此操作:
基本上,通过查看profile.views.create_profile中的代码,我们肯定它最终在设置
user
之后调用保存在配置文件上 . 这可能不是第一次,所以我们需要陷入这种情况而忘记它 . 因为最终,它总是会保存回底层用户 .