2013-08-05 2 views
2

Это мой forms.py фрагментDjango модели Form - Невозможно обновить таблицу с внешним ключом

class ContactForm(forms.ModelForm): 
    class Meta: 
     model = Contact 
     exclude = ('user',) 

Это мой views.py фрагмент

def contact(request, template_name): 
    if request.method == "POST": 
     form = ContactForm(request.POST) 
     if form.is_valid(): 
      obj = form.save(commit=False) 
      obj.user = request.user 
      obj.save() 
      return HttpResponseRedirect('/newuser/step2/') 
    else: 
     if (Contact.objects.filter(user=request.user)): 
      contact_obj = Contact.objects.get(user_id=request.user.id) 
      form = ContactForm(instance = contact_obj) 
     else: 
      form = ContactForm() 

    return render_to_response(template_name, RequestContext(request, {'form' : form})) 

Когда я заполнить данные для первого время для зарегистрированного пользователя, данные успешно попадают в таблицу. Когда я снова посетить форму, данные из базы данных загружается, но когда вновь представить, ниже ошибки приходят

Exception Type: IntegrityError 
Exception Value: (1062, "Duplicate entry '3' for key 'user_id'") 
Exception Location: /usr/lib/python2.7/dist-packages/MySQLdb/connections.py in defaulterrorhandler, line 36 

Мой контакт таблица автоматически генерируемый «ID», поле в качестве первичного ключа, в то время как «user_id» является поле внешнего ключа. «3» - это «user_id» для зарегистрированного пользователя.

Я пытаюсь сделать очень простую вещь, сохранить некоторые данные для пользователя в таблице и связать ее. Есть ли лучший способ сделать это? Что я здесь делаю неправильно?

ответ

2

Поскольку вы редактируете, вам нужно получить объект формы, используя экземпляр объекта. В вашем случае он пытается создать новый объект, но поскольку этот pk уже существует, он бросает ошибку целостности.

form = ContactForm(request.POST, instance=contact_obj) 

Перемещение создание contact_obj до начала способа просмотра

Что-то вроде этого:

from django.core.exceptions import MultipleObjectsReturned 
def contact(request, template_name): 
    try: 
     contact_obj = Contact.objects.get(user=request.user) 
    except: #You might want to handle multiple objects returned case here too.. 
     contact_obj = None 

    form = ContactForm(instance=contact_obj) 

    if request.method == "POST": 
     form = ContactForm(request.POST, instance=contact_obj) 
     if form.is_valid(): 
      obj = form.save(commit=False) 
      obj.user = request.user 
      obj.save() 
      return HttpResponseRedirect('/newuser/step2/') 

    return render_to_response(template_name, RequestContext(request, {'form' : form})) 
+0

, если только я мог бы дать вам больше upvotes ... – jliendo

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