Python基础day55
通过结合前端页面实现ORM对数据的增删改查
写一个页面,把数据库中的数据以表格形式展示出来,然后在每一行的后面加上两个按钮,分别是修改、删除
思路:
思考修改功能的逻辑:
1. 确定修改哪条记录,怎么确定?通过主键id确定唯一一条记录
2. 点击修改的按钮,需要跳转到一个修改的页面
3. 应该通过id查询到原来的数据,并且把这个记录的数据展示到写稿的页面
4. 开始修改,提交到后端的修改数据的方法中
# 需要自己写一个edit_user.html文件 def edit_user(request): id = request.GET.get('id') userinfo = models.UserInfo.objects.filter(id=id).first() if request.method == 'POST': '''写修改的逻辑''' hidden_id = request.POST.get('hidden_id') username = request.POST.get('username') password = request.POST.get('password') age = request.POST.get('age') gender = request.POST.get('gender') # 修改数据表中的数据 models.UserInfo.objects.filter(id=hidden_id).update(username=username, password=password,age=age, gender=gender) # 第二种修改方式 # userinfo.username = username # userinfo.password = password # userinfo.age = age # userinfo.gender = gender # userinfo.save() # 保存数据的 # return redirect('/userlist/') return render(request, 'edit_user.html', locals())
思考删除功能的逻辑:
1. 确定删除哪条记录,怎么确定?通过主键id确定唯一一条记录
2. 点击删除的按钮,请求到后端的删除地址
3. 后端拿到id直接做删除操作、跳转回列表页面
def del_user(request): # 在HTML文件中通过href="/edit_user/?id={{ user.id }}"来拿到id id = request.GET.get('id') models.UserInfo.objects.filter(id=id).delete() return redirect('/userlist/')
动静态网页
静态网页
直接将写固定数据,一支部会变的
动态网页
从后端取数据展示到页面
数据是从数据库中查询出来的也是动态网页
def userlist(request): # 从数据库中查询数据 user_list = models.UserInfo.objects.all() # 查询所有数据 print(user_list) return render(request, 'userlist.html', locals()) # locals() 让内部的局部变量能够在html文件中也能使用 {% for user in user_list %} <tr> <td>{{ user.id }}</td> <td>{{ user.username }}</td> <td>{{ user.password }}</td> <td>{{ user.age }}</td> <td>{{ user.gender }}</td> # 模块化输出数据库数据
Django创建表关系
""" 一对一 一对多 多对多 """ 我们以图书表、出版社表、作者表、作者详情表为例创建 # 判断表关系:换位思考法 分析表关系: 图书表和出版社表是一对多的关系 >>> 外键如何创建:外键字段建在多的一方 图书表和作者表是多对多的关系 >>> 外键如何创建:外键字段建在第三张表中 """ 创建多对多的方式有3种方式,先将一种 """ 作者表和作者详情是一对一的关系 >>> 外键如何创建:外键字段建在查询频率较高的一方 # 创建表关系字段先创建表的基础字段,先创建没有的外键的,最后在写外键字段 class Book(models.Model): title = models.CharField(max_length=64) """ max_digits=None, 总共多少位 decimal_places=None 小数占几位 """ # price decimal(8,2) price = models.DecimalField(max_digits=8, decimal_places=2) # publish_id = models.ForeignKey(to='Publish', to_field='id') # 创建外键的 """如果你的字段是主键字段,那么,你就不用在字段的后面拼接_id了,它会自定的拼接_id""" publish = models.ForeignKey(to='Publish') # 创建外键的 默认就是跟表的主键字段建立关系 """ authors:它是一个虚拟字段,意思是,在book表中不会实际创建出来这个字段,它能够创建出来第三张表(自动) """ authors = models.ManyToManyField(to='Author', ) class Publish(models.Model): title = models.CharField(max_length=64) addr = models.CharField(max_length=64) class Author(models.Model): name = models.CharField(max_length=64) author_detail = models.OneToOneField(to='AuthorDetail') # django1版本 on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。 models.CASCADE 删除关联数据,与之关联也删除 models.DO_NOTHING 删除关联数据,引发错误IntegrityError models.PROTECT 删除关联数据,引发错误ProtectedError models.SET_NULL 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空) models.SET_DEFAULT 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值) models.SET 删除关联数据, a. 与之关联的值设置为指定值,设置:models.SET(值) b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) # django2 class Book(models.Model): title = models.CharField(max_length=64) """ max_digits=None, 总共多少位 decimal_places=None 小数占几位 """ # price decimal(8,2) price = models.DecimalField(max_digits=8, decimal_places=2) # publish_id = models.ForeignKey(to='Publish', to_field='id') # 创建外键的 """如果你的字段是主键字段,那么,你就不用在字段的后面拼接_id了,它会自定的拼接_id""" publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE) # 创建外键的 默认就是跟表的主键字段建立关系 """ authors:它是一个虚拟字段,意思是,在book表中不会实际创建出来这个字段,它能够创建出来第三张表(自动) """ authors = models.ManyToManyField(to='Author', ) class Publish(models.Model): title = models.CharField(max_length=64) addr = models.CharField(max_length=64) class Author(models.Model): name = models.CharField(max_length=64) author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE) class AuthorDetail(models.Model): phone = models.CharField(max_length=64) qq = models.CharField(max_length=64)
Django框架的请求生命周期
其实就是帮我们梳理Django框架的执行流程,它能够更好地帮助我们后面的复习