request对象方法初识 和pycharm django链接数据库(mysql) django orm简介 与利用orm实现增删改查操作(2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | """ 我们将html文件默认都放在templates文件夹下 我们将网站所使用的静态文件默认都放在static文件夹下 静态文件 前端已经写好了的 能够直接调用使用的文件 网站写好的js文件 网站写好的css文件 网站用到的图片文件 第三方前端框架 ... 拿来就可以直接使用的 """ # django默认是不会自动帮你创建static文件夹 需要你自己手动创建 一般情况下我们在static文件夹内还会做进一步的划分处理 - static - - js - - css - - img 其他第三方文件 """ 在浏览器中输入url能够看到对应的资源 是因为后端提前开设了该资源的借口 如果访问不到资源 说明后端没有开设该资源的借口 http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css """ # 静态文件配置 """ *************************************************************** 当你在写django项目的时候 可能会出现后端代码修改了但是前端页面没有变化的情况 1.你在同一个端口开了好几个django项目 一直在跑的其实是第一个django项目 2.浏览器缓存的问题 settings network disable cache 勾选上 ***************************************************************** """ STATIC_URL = '/ooo/' # 类似于访问静态文件的令牌 """如果你想要访问静态文件 你就必须以static开头""" """ /static/bootstrap-3.3.7-dist/js/bootstrap.min.js /static/令牌 取列表里面从上往下依次查找 bootstrap-3.3.7-dist/js/bootstrap.min.js 都没有才会报错 """ # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static' ), os.path.join(BASE_DIR, 'static1' ), os.path.join(BASE_DIR, 'static2' ), ] # 静态文件动态解析 { % load static % } <link rel = "stylesheet" href = "{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}" > <script src = "{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}" >< / script> # form表单默认是get请求数据 http: / / 127.0 . 0.1 : 8000 / login / ?username = jason&password = 123 """ form表单action参数 1.不写 默认朝当前所在的url提交数据 2.全写 指名道姓 3.只写后缀 /login/ """ # 在前期我们使用django提交post请求的时候 需要取配置文件中注释掉一行代码 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware' , 'django.contrib.sessions.middleware.SessionMiddleware' , 'django.middleware.common.CommonMiddleware' , # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware' , 'django.contrib.messages.middleware.MessageMiddleware' , 'django.middleware.clickjacking.XFrameOptionsMiddleware' , ] |
1 2 3 4 5 6 7 8 9 10 11 | request.method # 返回请求方式 并且是全大写的字符串形式 <class 'str'> request.POST # 获取用户post请求提交的普通数据不包含文件 request.POST.get() # 只获取列表最后一个元素 request.POST.getlist() # 直接将列表取出 request.GET # 获取用户提交的get请求数据 request.GET.get() # 只获取列表最后一个元素 request.GET.getlist() # 直接将列表取出 """ get请求携带的数据是有大小限制的 大概只有4KB左右 而post请求则没有限制 """ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # 默认用的是sqkite3 注释掉然后用下面的DATABASES 模板 DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.sqlite3' , 'NAME' : os.path.join(BASE_DIR, 'db.sqlite3' ), } } # django链接MySQL 1. 第一步配置文件中配置 DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.mysql' , 'NAME' : 'day60' , 'USER' : 'root' , 'PASSWORD' : 'admin123' , 'HOST' : '127.0.0.1' , 'PORT' : 3306 , 'CHARSET' : 'utf8' } } 2. 代码声明 django默认用的是mysqldb模块链接MySQL 但是该模块的兼容性不好 需要手动改为用pymysql链接 你需要告诉django不要用默认的mysqldb还是用pymysql # 在项目名下的init或者任意的应用名下的init文件中书写以下代码都可以 import pymysql pymysql.install_as_MySQLdb() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | """ ORM. 对象关系映射 类 表 对象 记录 对象属性 记录某个字段对应的值 应用下面的models.py文件 """ # 1 先去models.py中书写一个类 class User(models.Model): # id int primary_key auto_increment id = models.AutoField(primary_key = True ) # username varchar(32) username = models.CharField(max_length = 32 ) # password int password = models.IntegerField() * * * * * * * * * * * * * * * * * * * * * * * * * # 2 数据库迁移命令************************* python3 manage.py makemigrations 将操作记录记录到小本本上(migrations文件夹) python3 manage.py migrate 将操作真正的同步到数据库中 # 只要你修改了models.py中跟数据库相关的代码 就必须重新执行上述的两条命令 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * class User(models.Model): # id int primary_key auto_increment id = models.AutoField(primary_key = True ,verbose_name = '主键' ) # username varchar(32) username = models.CharField(max_length = 32 ,verbose_name = '用户名' ) """ CharField必须要指定max_length参数 不指定会直接报错 verbose_name该参数是所有字段都有的 就是用来对字段的解释 """ # password int password = models.IntegerField(verbose_name = '密码' ) class Author(models.Model): # 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段 # 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段 # 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写 # username varchar(32) username = models.CharField(max_length = 32 ) # password int password = models.IntegerField() |
1 2 3 4 5 6 7 8 9 10 11 | # 字段的增加 1. 可以在终端内直接给出默认值 2. 该字段可以为空 info = models.CharField(max_length = 32 ,verbose_name = '个人简介' ,null = True ) 3. 直接给字段设置默认值 hobby = models.CharField(max_length = 32 ,verbose_name = '兴趣爱好' ,default = 'study' ) # 字段的修改 直接修改代码然后执行数据库迁移的两条命令即可! # 字段的删 直接注释对应的字段然后执行数据库迁移的两条命令即可! 执行完毕之后字段对应的数据也都没有了 |
数据的增删改查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 查 res = models.User.objects. filter (username = username) """ 返回值你先看成是列表套数据对象的格式 它也支持索引取值 切片操作 但是不支持负数索引 它也不推荐你使用索引的方式取值 user_obj = models.User.objects.filter(username=username).first() """ filter 括号内可以携带多个参数 参数与参数之间默认是 and 关系 你可以把 filter 联想成where记忆 # 增 from app01 import models res = models.User.objects.create(username = username,password = password) # 返回值就是当前被创建的对象本身 # 第二种增加 user_obj = models.User(username = username,password = password) user_obj.save() # 保存数据 |
数据的查,改,删
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # 查看 def userlist(request): # 查询出用户表里面所有的数据 # 方式1 # data = models.User.objects.filter() # print(data) # 方式2 user_queryset = models.User.objects. all () # return render(request,'userlist.html',{'user_queryset':user_queryset}) return render(request, 'userlist.html' , locals ()) 如何告诉后端用户想要编辑哪条数据? 将编辑按钮所在的那一行数据的主键值发送给后端 利用url问号后面携带参数的方式 { % for user_obj in user_queryset % } <tr> <td>{{ user_obj. id }}< / td> <td>{{ user_obj.username }}< / td> <td>{{ user_obj.password }}< / td> <td> <a href = "/edit_user/?user_id={{ user_obj.id }}" class = "btn btn-primary btn-xs" >编辑< / a> <a href = " " class=" btn btn - danger btn - xs">删除< / a> < / td> < / tr> { % endfor % } # 后端查询出用户想要编辑的数据对象 展示到前端页面供用户查看和编辑 def edit_user(request): # 获取url问号后面的参数 edit_id = request.GET.get( 'user_id' ) # 查询当前用户想要编辑的数据对象 edit_obj = models.User.objects. filter ( id = edit_id).first() if request.method = = "POST" : username = request.POST.get( 'username' ) password = request.POST.get( 'password' ) # 去数据库中修改对应的数据内容 # 修改数据方式1 # models.User.objects.filter(id=edit_id).update(username=username,password=password) """ 将filter查询出来的列表中所有的对象全部更新 批量更新操作 只修改被修改的字段 """ # 修改数据方式2 edit_obj.username = username edit_obj.password = password edit_obj.save() """ 上述方法当字段特别多的时候效率会非常的低 从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改 """ # 跳转到数据的展示页面 return redirect( '/userlist/' ) # 将数据对象展示到页面上 return render(request, 'edit_user.html' , locals ()) # 删除功能 """ 跟编辑功能逻辑类似 def delete_user(request): # 获取用户想要删除的数据id值 delete_id = request.GET.get('user_id') # 直接去数据库中找到对应的数据删除即可 models.User.objects.filter(id=delete_id).delete() """ 批量删除 """ # 跳转到展示页面 return redirect('/userlist/') """ |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!