您的位置:首页 > 编程语言 > Go语言

关于django中ModelForm的instance

2011-10-30 12:18 387 查看
我使用ModelForm修改数据库数据时,总是添加一条新的记录,而且原来的记录维持不变,搞了一天也没弄明白怎么回事就,最后用一种很笨得方法解决了,其中N多东西不明白,先记下了,以后慢慢研究。

原来的代码:

def edit(request,id,entry,form,str):

item_id = int(id)

item = get_object_or_404(entry,pk=item_id)

if request.method == 'POST':

edit_form = form(request.POST,instance=item)

if edit_form.is_valid():

edit_form.save()

return HttpResponseRedirect('/'+str+'/list/1')

else:

edit_form = form(instance=item)

return render_to_response('equipment/edit.html', {'edit_form':edit_form,'str':str})

id是需要修改记录的主键,entry是记录的Model,form是ModelForm

使用这段代码修改一个记录时,原来的记录没有被修改,而是添加了条新的记录,也就是说edit_form.save()执行了一天insert语句,而不是update语句。

在if edit_form.is_valid()之后我使用下面几种方法都不管用

1、edit_form.instance = item

2、edit_form.id = item_id

3、edit_form.pk = item_id

在很无奈情况下我想,既然它插入一条新的数据,那我把老数据删除了也能达到效果,于是我的程序编程了这样:

def edit(request,id,entry,form,str):

item_id = int(id)

item = get_object_or_404(entry,pk=item_id)

if request.method == 'POST':

edit_form = form(request.POST,instance=item)

if edit_form.is_valid():

edit_form.save()

item.delete() #保存完毕后删除原来的记录

return HttpResponseRedirect('/'+str+'/list/1')

else:

edit_form = form(instance=item)

return render_to_response('equipment/edit.html', {'edit_form':edit_form,'str':str})

但是程序还是不奏效,item.delete()并没有删除原来的数据。

经过各种病急乱投医,下面程序达到了效果

def edit(request,id,entry,form,str):

item_id = int(id)

item = get_object_or_404(entry,id=item_id)

item.delete() #先删除原来的数据

if request.method == 'POST':

edit_form = form(request.POST,instance=item)

if edit_form.is_valid():

edit_form.save()

return HttpResponseRedirect('/'+str+'/list/1')

else:

edit_form = form(instance=item)

return render_to_response('equipment/edit.html',{'edit_form':edit_form,'str':str})

整个过程两个问题不明白:

一、为什么在有instace的情况下django还是执行了insert语句

二、为什么在edit_form.save()执行之前item.delete()可以删除记录,而执行之后就不能删除记录了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: