Django-profiles自定义创建/编辑modelForm无法正确保存

时间:2010-07-21 15:59:43

标签: django save profile registration

要点:

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。据我所知,当我来创建配置文件或编辑个人资料页面时,我应该自动编辑与我登录的用户关联的配置文件。

当我来创建或编辑用户页面时,用户模型已经存在,但配置文件却没有。这是问题的原因吗?我想我误解了一些重要的事情,我非常感谢任何关于我哪里出错的指示。谢谢!

1 个答案:

答案 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。这可能不是第一次,所以我们需要陷入这种情况而忘记它。因为最终,它会被调用并触发我们的保存到用户代码。结果是,无论您将来使用此用户配置文件的形式如何,它总是会保存回基础用户。