2016-03-22 21 views
1

Django sitemde iki kullanıcı profili vardır: biri düzenli kullanıcı (MyUserProfile) ve bunu genişleten kişi (EmployeeUserProfile). models.py:Güncelleme sonrasında Profil modelini kaydetme: IntegrityError (yinelenen user_id anahtarı)

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

Ben çalışanlar için bir profil güncelleme formunu uygulayan bir sorun var. Ben böylece formu (forms.py) oluşturun:

from django.forms import ModelForm 
from .models import EmployeeUserProfile 

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

Ama profilini güncelleyerek geldiğinde:

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

ben bir IntegrityError olsun halihazırda oluşturulmuş profil güncellemek için 'Gönder'. Örneğin, (1062, "Duplicate entry '2' for key 'user_id'"). Görünüşe göre Django, mevcut olanı güncellemek yerine kullanıcının bir kopyasını eklemeye çalışıyor.

Neyi yanlış yapıyorum?

cevap

5

Sen de

form = EmployeeUserProfileForm(request.POST) 

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

By not sending the instance argument, form tries to create instead of update olmalıdır POST durumda örnek argüman geçmeleri gerekiyor. Bu böyle if

Something yukarıda else bloğu taşımak zorunda kalacak anlamına geleceğini Not: Ayrıca anonim kullanıcı ile sorunları çalıştırmak yok ki login_required dekoratör kullanmak isteyebilirsiniz

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

, vb ..

+0

Doh! Şimdi aptalım. Teşekkür ederim-- bu yanlıştı. (Ben login_required' var). – xnx

+0

Sevindim yardımcı oldu .. Öğrenme deneyiminin bir parçası :) – karthikr