更新后保存配置文件模型:IntegrityError(重复的user_id键)

xnx*_*xnx 1 forms django user-profile

我的Django站点有两种用户配置文件,一种用于常规用户(MyUserProfile),另一种用于扩展它,用于员工(EmployeeUserProfile).models.py:

class MyUserProfile(models.Model):
    user = models.OneToOneField('auth.user', related_name='userprofile')
    www = models.URLField(null=True, blank=True, verbose_name='website')
    affiliation = models.CharField(max_length=200,null=True,blank=True)
    ...

class EmployeeUserProfile(MyUserProfile):
    start_date = models.DateField()
    current = models.BooleanField(default=True)
    ...
Run Code Online (Sandbox Code Playgroud)

我在为员工实施配置文件更新表时遇到问题.我创建了这样的形式(forms.py):

from django.forms import ModelForm
from .models import EmployeeUserProfile

class EmployeeUserProfileForm(ModelForm):
    class Meta:
        model = EmployeeUserProfile
        exclude = ['user', 'current']
Run Code Online (Sandbox Code Playgroud)

但是当我来更新配置文件时:

from django.template import RequestContext
from .forms import EmployeeUserProfileForm

def update_profile(request):
    if request.method == 'POST':
        form = EmployeeUserProfileForm(request.POST)
        if form.is_valid():
            profile = form.save(commit=False)
            profile.user = request.user
            profile.save()
    else:
        user = request.user
        profile = user.userprofile.employeeuserprofile
        form = EmployeeUserProfileForm(instance=profile)
    c = {'form': form}
    return render_to_response('pages/profile/update.html', c,
                              context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

在'submit'上更新已经创建的个人资料,我得到了一个IntegrityError.例如,(1062, "Duplicate entry '2' for key 'user_id'").显然Django正在尝试添加用户的副本,而不是更新现有用户.

我究竟做错了什么?

kar*_*ikr 5

您还需要在POST条件中传递实例参数

form = EmployeeUserProfileForm(request.POST)
Run Code Online (Sandbox Code Playgroud)

应该

form = EmployeeUserProfileForm(request.POST, instance=profile)
Run Code Online (Sandbox Code Playgroud)

通过不发送instance参数,表单尝试create而不是update.请注意,这意味着您必须移动else上面的块if

像这样的东西:

@login_required
def update_profile(request):

    user = request.user
    profile = user.userprofile.employeeuserprofile
    form = EmployeeUserProfileForm(instance=profile)

   if request.method == 'POST':
        form = EmployeeUserProfileForm(request.POST, instance=profile)
        if form.is_valid():
            profile = form.save(commit=False)
            profile.user = request.user
            profile.save()

    c = {'form': form}
    return render_to_response('pages/profile/update.html', c,
                              context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

您可能还想使用login_required装饰器,以便您不会遇到匿名用户等问题.