使用Django更新数据库记录时重复新增问题求助
Django更新记录却新增数据的问题解决
你当前的代码逻辑完全是创建新记录,而非更新原有记录。因为tblbook(BookID=..., BookName=...)这种写法会生成一个全新的tblbook模型实例——哪怕你复制了原记录的字段值,它和数据库中id对应的那条记录也没有任何关联,调用save()自然会插入一条新数据。
方案1:直接更新原模型实例
如果不需要用户提交表单,仅后端直接修改记录,直接操作获取到的book实例即可:
def update(request, id): book = tblbook.objects.get(id=id) # 在这里修改需要更新的字段,示例: # book.Price = 39.99 # book.BookName = "修改后的书名" book.save() # 保存原实例,执行数据库update操作 return redirect("/show")
方案2:使用ModelForm处理用户提交的更新(符合Django规范)
如果要通过表单让用户编辑数据,必须用instance参数把表单和原记录绑定,这样save()时才会更新而非新增:
第一步:定义ModelForm
在你的app目录下创建forms.py,添加表单类:
from django import forms from .models import tblbook class BookUpdateForm(forms.ModelForm): class Meta: model = tblbook fields = ['BookID', 'BookName', 'Genre', 'Price'] # 指定允许编辑的字段
第二步:修改视图函数
def update(request, id): book = tblbook.objects.get(id=id) if request.method == 'POST': # 传入request.POST和instance=book,绑定原数据库记录 form = BookUpdateForm(request.POST, instance=book) if form.is_valid(): form.save() # 此时执行update操作,而非新增 return redirect("/show") else: # GET请求时,用原记录数据填充表单 form = BookUpdateForm(instance=book) # 返回编辑页面(需自行创建对应的模板文件) return render(request, 'book_update.html', {'form': form})
内容的提问来源于stack exchange,提问作者Nauman khan
相关产品推荐
相关产品推荐

