首页 文章

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

提问于
浏览
1

摘要:

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 回答

  • 0

    您可以根据需要复制字段,并按上述方式对其进行双重更新,但这不是配置文件的用途 . 它应该处理不在原始auth.User中的字段,因为您不需要直接编辑该模型 . 你上面提到“扩展用户” - 你实际上并没有继承auth.User,不是吗?我强烈建议不要这样做 .

    更新:

    this reference material . 它使用与您相同的语法在配置文件中进行用户更新 .

    更新2:

    该示例适用于 edit profile ,而不是创建配置文件 . 查看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()
    

    因此它首先保存表单,然后设置 user ,然后保存配置文件 .

    这意味着您无法在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 之后调用保存在配置文件上 . 这可能不是第一次,所以我们需要陷入这种情况而忘记它 . 因为最终,它总是会保存回底层用户 .

相关问题