2016-03-22 24 views
1

我的Django站點有兩種用戶配置文件,一種用於普通用戶(MyUserProfile),另一種用於員工(EmployeeUserProfile)。 models.py保存更新後的配置文件模型:IntegrityError(重複的user_id鍵)

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正在嘗試添加用戶的副本,而不是更新現有的副本。

我在做什麼錯?

回答

5

您需要通過實例論證在POST條件太

form = EmployeeUserProfileForm(request.POST) 

應該

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

By not sending the instance argument, form tries to create instead of update。請注意,這將意味着你將不得不移到高於if

這樣的事情else塊:

@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裝飾,等等。

+0

Doh!我現在感到很蠢。謝謝 - 那是錯的。 (我有'login_required')。 – xnx

+0

很高興幫助..所有的學習經驗的一部分:) – karthikr