1.修改数据的步奏
1.1 单个数据的修改
- 查询:通过get()得到要修改的实体对象
- 改:对对象.属性进行修改
- 保存
b = Book.objects.get(id=1) # 得到对象
b.price = 22 # 对象重新赋值
b.save() # 保存
1.2 批量数据修改
调用QuerySet的update
# 将售价大于30元的图书价格修改为0
b = Book.objects.filter(price__gt=30)
b.update(price=0)
2.制作“更新书籍”的功能
现在需要实现点击更新按钮,就可以更改price和mark_price两个值,然后保存到数据库,刷新页面后就能看见修改后的值。
2.1 实现思路
- 点击更新后,通过get方法在地址传入书籍的id,路由试到修改页面。
- 修改页面通过传入的id通过视图层找到数据库中的条目,显示在模板层
- 两个价格通过post方法提交数据到视图层完成数据的更新,然后返回一个302跳转。
2.2 实现过程
2.2.1 视图层的处理,需要分别处理GET和POST请求。
场景均是单条数据的修改,使用get方法来获取数据的对象。
处理GET请求跳转到更新页面,处理POST请求提交数据到数据库。
def update_book(request, book_id):
# 接收book_id获取数据库单条记录,使用get方法,因为get方法找不到数据要报错,所以try一下
try:
book = Book.objects.get(id=book_id)
except Exception as e:
print("查找对象发现错误:%s"%(e))
return HttpResponse('查找对象发现错误')
# 分别处理GET和POST的请求
# GET请求返回修改页面,并传入前面查找到的数据book对象
if request.method == 'GET':
return render(request, 'bookstore/update_book.html',locals())
elif request.method == 'POST':
# 获取post来的值
price = request.POST['price']
mark_price = request.POST['mark_price']
# 对book对象的属性进行重新赋值
book.price = price
book.mark_price = mark_price
# 保存
book.save()
# 保存完了就跳转回图书展示页面
return HttpResponseRedirect('/bookstore/all_book')
2.2.2 模板制作
模板中,仅对两个价格可以开放修改,其他均添加了disabled
,因为价格要修改,所以要定义个name
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>价格调整</title>
</head>
<body>
<form action="/bookstore/update_book/{{ book.id}}" method="post">
<p>
书名:<input type="text" value="{{ book.title }}" disabled="disabled">
</p>
<p>
出版社:<input type="text" value="{{ book.pub }}" disabled="disabled">
</p>
<p>
成本价:<input type="text" value="{{ book.price }}" name="price">
</p>
<p>
标价:<input type="text" value="{{ book.mark_price }}" name="mark_price">
</p>
<p>
<input type="submit" value="更新">
</p>
</form>
</body>
</html>
2.2.3 绑定路由
from . import views
from django.urls import path
urlpatterns = [
path('all_book', views.all_book),
# 使用转换器,传入GET参数
path('update_book/<int:book_id>', views.update_book)
]
2.3 实现效果
点击更新后