当先锋百科网

首页 1 2 3 4 5 6 7

1.修改数据的步奏

1.1 单个数据的修改

  1. 查询:通过get()得到要修改的实体对象
  2. 改:对对象.属性进行修改
  3. 保存
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 实现思路

  1. 点击更新后,通过get方法在地址传入书籍的id,路由试到修改页面。
  2. 修改页面通过传入的id通过视图层找到数据库中的条目,显示在模板层
  3. 两个价格通过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 实现效果

在这里插入图片描述
在这里插入图片描述
点击更新后
在这里插入图片描述