2016-03-22 15 views
1

私のDjangoサイトには、通常のユーザー用(MyUserProfile)と従業員用の拡張ユーザー用(EmployeeUserProfile)の2種類のユーザープロファイルがあります。 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) 
    ... 

私は従業員のためのプロファイル更新フォームの実装に問題があります。私はIntegrityErrorを取得し、既に作成したプロファイルを更新するための「提出」で

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

:私はプロファイルを更新に来たときに

from django.forms import ModelForm 
from .models import EmployeeUserProfile 

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

しかし、私はこのようにフォーム(forms.py)を作成します。たとえば、(1062, "Duplicate entry '2' for key 'user_id'")です。どうやら、Djangoは既存のものを更新するのではなく、ユーザーのコピーを追加しようとしています。

私は間違っていますか?

答えて

5

あなたも

form = EmployeeUserProfileForm(request.POST) 

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

By not sending the instance argument, form tries to create instead of updateでなければなりませんPOST状態でインスタンス引数を渡す必要があります。 、また、あなたは匿名ユーザーの問題に遭遇していけないようにlogin_requiredデコレータを使用する場合があります

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

:これはあなたがif

elseブロックを移動しなければならない意味するであろうことに注意してください、このような何か

+0

Doh!今私は愚かな気がする。ありがとうございました。それは間違っていました。 (私は 'login_required'を持っています)。 – xnx

+0

喜んでそれ..すべての学習経験の一部:) – karthikr

関連する問題