Skip to main content
 首页 » 编程设计

python之Django 模型表单之无法使用外键更新表

2024年11月01日22fff_TT

这是我的 forms.py 片段

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”。

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

请您参考如下方法:

既然是编辑,就需要使用对象实例来获取表单对象。在您的情况下,它会尝试创建一个新对象,但由于此 pk 已经存在,因此它会抛出完整性错误。

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

将 contact_obj 的创建移动到 View 方法的开头

像这样:

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