【问题标题】:Django Model Form - Unable to update table with foreign keyDjango 模型表单 - 无法使用外键更新表
【发布时间】:2013-08-06 07:26:43
【问题描述】:

这是我的 forms.py sn-p

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

这是我的意见.py sn-p

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

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

【问题讨论】:

    标签: python django modelform


    【解决方案1】:

    由于您正在编辑,您需要使用对象实例来获取表单对象。在您的情况下,它会尝试创建一个新对象,但由于此 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}))
    

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 2018-05-19
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多