这是我的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”。
我正在尝试做一个非常简单的事情,在表中为用户存储一些数据并链接它。有没有更好的方法呢?我在这里做错了什么?
答案 0 :(得分: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}))