【问题标题】:Saving Profile model after update: IntegrityError (duplicate user_id key)更新后保存配置文件模型:IntegrityError(重复的 user_id 键)
【发布时间】:2016-03-22 14:31:35
【问题描述】:

我的 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)
    ...

我在为员工实施个人资料更新表单时遇到问题。我因此创建了表单(forms.py):

from django.forms import ModelForm
from .models import EmployeeUserProfile

class EmployeeUserProfileForm(ModelForm):
    class Meta:
        model = EmployeeUserProfile
        exclude = ['user', 'current']

但是当我要更新个人资料时:

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))

在“提交”以更新已创建的个人资料时,我得到一个IntegrityError。例如,(1062, "Duplicate entry '2' for key 'user_id'")。显然 Django 正在尝试添加用户的副本,而不是更新现有的。

我做错了什么?

【问题讨论】:

    标签: django forms user-profile


    【解决方案1】:

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

    form = EmployeeUserProfileForm(request.POST)
    

    应该是

    form = EmployeeUserProfileForm(request.POST, instance=profile)
    

    By not sending the instance argument, form tries to create instead of 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))
    

    您可能还想使用login_required 装饰器,这样您就不会遇到匿名用户等问题。

    【讨论】:

    • 噢!我现在觉得很傻。谢谢你——那是错的。 (我确实有login_required)。
    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多