Python Django模型表单-无法使用外键更新表

Python Django模型表单-无法使用外键更新表,python,django,modelform,Python,Django,Modelform,这是我的forms.py代码段 class ContactForm(forms.ModelForm): class Meta: model = Contact exclude = ('user',) def contact(request, template_name): if request.method == "POST": form = ContactForm(request.POST) if form.is

这是我的forms.py代码段

class ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        exclude = ('user',)
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}))
这是我的views.py代码段

class ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        exclude = ('user',)
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'是登录用户的“用户id”


我正在尝试做一件非常简单的事情,将用户的一些数据存储在一个表中并链接它。有更好的方法吗?我在这里做错了什么?

因为您正在编辑,所以需要使用对象实例获取表单对象。在您的例子中,它试图创建一个新对象,但由于此
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}))