2016-03-22 7 views
1

На моем сайте Django есть два вида пользовательских профилей, один для обычных пользователей (MyUserProfile) и один, который его расширяет, для сотрудников (EmployeeUserProfile). models.py:Сохранение модели профиля после обновления: IntegrityError (duplicate user_id key)

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. Обратите внимание, что это означало бы, вы должны переместить 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 декоратора, так что вы не столкнулись с проблемами с анонимным пользователем, и т. д.

+0

Doh! Теперь я чувствую себя глупо. Спасибо, это было неправильно. (У меня есть 'login_required'). – xnx

+0

Рад, что это помогло .. Вся часть опыта обучения :) – karthikr

 Смежные вопросы

  • Нет связанных вопросов^_^