2013-08-05 11 views
2

表這是我forms.py片斷Django的雛型 - 無法更新與外鍵

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