每日测验

  1. """
  2. 今日考题
  3. 1.什么是静态文件,django静态文件配置如何配置,如何解决接口前缀不断变化,html页面上路径的引用需要反复修改的问题
  4. 2.request对象的方法有哪些,分别是干什么用的,请具体阐述细节及注意事项
  5. 3.django自带的数据库是什么,如何换成其他数据库例如MySQL,如何配置更换
  6. 4.什么是django orm,如何使用django orm,数据库迁移命令如何书写
  7. 5.orm字段的增删改查与数据的增查如何实现
  8. """

昨日内容回顾

  • 静态文件配置

    1. """
    2. 在浏览器窗口输入url之所以能够访问到对应的资源是因为后端提前开设了该资源的访问接口
    3. 我们习惯将html文件存放在templates文件夹下
    4. 我们习惯将静态文件存放在static文件夹下
    5. 静态文件
    6. 网站已经写好的 活着是第三方现成的代码 直接拷贝使用
    7. css文件 js文件 img文件 第三方组件
    8. static文件夹内还会创建几个文件夹
    9. css
    10. js
    11. img
    12. 第三方
    13. django不会自动帮你创建static文件夹需要你自己手动创建
    14. """
    15. STATIC_URL = '/static/' # 访问静态文件的令牌
    16. # 静态文件配置 settings.py
    17. STATICFILES_DIRS = [ # 令牌持有者可以访问的文件路径
    18. os.path.join(BASE_DIR,'static'),
    19. os.path.join(BASE_DIR,'static1'),
    20. os.path.join(BASE_DIR,'static2'),
    21. ]
    22. """
    23. 查找顺序就是从上往下依次查找,查找到一个就不会继续往下找了所以可能会出现替换的情况
    24. """
    25. # 令牌动态解析
    26. <link href="/static/a.txt"></link>
    27. {% load static %}
    28. <link href="{% static 'a.txt' %}"></link>
  • request对象方法

    1. # 登陆功能
    2. # form表单action三个参数写法
    3. request.method # 获取当前请求方式 全大写的字符串
    4. request.GET # 获取url问好后面携带的参数
    5. .get() 列表最后一个元素
    6. .getlist() 拿整个列表
    7. request.POST # 获取post请求提交过来的普通键值对(不包含文件)
    8. .get() 列表最后一个元素
    9. .getlist() 拿整个列表
    10. """
    11. 前期我们在朝django后端提交post请求的是时候要先去配置文件中注释一行代码
    12. MIDDLEWARE = [
    13. # csrf...
    14. ]
    15. """
    16. def index(request):
    17. if request.method == 'POST':
    18. return HttpResponse('post')
    19. return HttpResponse('get')
  • pycharm链接数据库

    1. # 找到pycharm database选项(三个地方查找)
    2. # 选取对应的数据库 下载对应的驱动
    3. """
    4. 明明链接上了数据库 但是看不到表无法操作
    5. 这个时候你只需要将刚刚创建的链接删除 重新链接一次即可
    6. """
  • django链接MySQL

    1. # 1.配置文件中配置
    2. DATABASES = {
    3. 'default': {
    4. 'ENGINE': 'django.db.backends.mysql',
    5. 'NAME': 'day60',
    6. 'USER':'root',
    7. 'PASSWORD':'admin123',
    8. 'HOST':'127.0.0.1',
    9. 'PORT':3306,
    10. 'CHARSET':'utf8'
    11. }
    12. }
    13. # 2.init文件指定pymysql
    14. import pymysql
    15. pymysql.install_as_MySQLdb()
  • django orm(重要)

    1. """
    2. orm不会帮你创建库 只能创建到表的层面
    3. 需要你自己提前创建好库
    4. """
    5. # 对象关系映射

    6. 记录 对象
    7. 数据 对象属性/方法
    8. """
    9. 能够让一个不会sql语句的python程序员也能够简单快捷的操作数据库,极大的提升开发效率
    10. """
    11. # 去应用下的models.py中书写模型类
    12. # 类 模型类
    13. # 表 模型表
    14. class UserInfo(models.Model):
    15. # 当你没有创建主键字段的时候orm会自动帮你创建一个名为id的主键字段
    16. uid = models.AutoField(primary_key=True)
    17. # uid int primary key auto_increment
    18. username = models.CharField(max_length=32)
    19. # username varchar(32) CharField字段一定要书写max_length参数
    20. password = models.IntegerField()
    21. # password int
    22. **************************数据库迁移命令*****************************
    23. 1.python3 manage.py makemigrations
    24. # 将操作记录到小本本上(migrations文件夹内) 不能真正的直接操作数据库
    25. 2.python3 manage.py migrate
    26. # 将操作真正的同步到数据库中
    27. """只要在models中书写了跟数据库相关的代码 就必须要重新执行上述两条命令"""
    28. # pycharm简单快捷输入
    29. tools
    30. run manage.py task
    31. 自动提示
    32. *******************************************************************
  • 简单的orm语句

    1. # 字段的增删改查
    2. # 增
    3. 1.终端里面自己加默认值
    4. 2.null=True
    5. 3.default='666'
    6. # 删
    7. 注释代码执行两条命令 (然后收拾行李跑路走人)
    8. # 在操作models.py中的代码的时候一定要细心
    9. # 改
    10. 修改代码执行两条命令
    11. # 数据的增查
    12. # 增
    13. from app01 import models
    14. 1.create()
    15. user_obj = models.UserInfo.objects.create(**kwargs)
    16. # 改方法有一个返回值 就是当前创建的数据对象本身
    17. 2.对象.save()
    18. # 先生成一个类对象
    19. user_obj = models.User(**kwargs)
    20. # 对象调用save方法
    21. user_obj.save()
    22. # 查
    23. 1.filter() # where
    24. res = models.UserInfo.objects.filter(**kwargs)
    25. """
    26. 返回的结果是一个querySet对象 你可以把它看成是一个列表套数据对象
    27. [数据对象1,数据对象2...]
    28. 支持索引和切片操作 但是不支持负数 并且不推荐你使用索引
    29. .first()方法
    30. filter括号内可以写多个参数 查询的时候默认是and关系
    31. """

今日内容概要

  • 数据的查,改,删
  • django orm中如何创建表关系
  • django请求生命周期流程图(重要)
  • 详细的讲django每一个部分的详细内容
    • 路由层(urls.py)
    • 虚拟环境
    • django版本区别

数据的查,改,删

  1. # 先讲数据库中的数据全部展示到前端 然后给每一个数据两个按钮 一个编辑一个删除
  2. # 查看
  3. def userlist(request):
  4. # 查询出用户表里面所有的数据
  5. # 方式1
  6. # data = models.User.objects.filter()
  7. # print(data)
  8. # 方式2
  9. user_queryset = models.User.objects.all()
  10. # return render(request,'userlist.html',{'user_queryset':user_queryset})
  11. return render(request,'userlist.html',locals())
  12. # 编辑功能
  13. # 点击编辑按钮朝后端发送编辑数据的请求
  14. """
  15. 如何告诉后端用户想要编辑哪条数据?
  16. 将编辑按钮所在的那一行数据的主键值发送给后端
  17. 利用url问号后面携带参数的方式
  18. {% for user_obj in user_queryset %}
  19. <tr>
  20. <td>{{ user_obj.id }}</td>
  21. <td>{{ user_obj.username }}</td>
  22. <td>{{ user_obj.password }}</td>
  23. <td>
  24. <a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
  25. <a href="" class="btn btn-danger btn-xs">删除</a>
  26. </td>
  27. </tr>
  28. {% endfor %}
  29. """
  30. # 后端查询出用户想要编辑的数据对象 展示到前端页面供用户查看和编辑
  31. def edit_user(request):
  32. # 获取url问号后面的参数
  33. edit_id = request.GET.get('user_id')
  34. # 查询当前用户想要编辑的数据对象
  35. edit_obj = models.User.objects.filter(id=edit_id).first()
  36. if request.method == "POST":
  37. username = request.POST.get('username')
  38. password = request.POST.get('password')
  39. # 去数据库中修改对应的数据内容
  40. # 修改数据方式1
  41. # models.User.objects.filter(id=edit_id).update(username=username,password=password)
  42. """
  43. 将filter查询出来的列表中所有的对象全部更新 批量更新操作
  44. 只修改被修改的字段
  45. """
  46. # 修改数据方式2
  47. edit_obj.username = username
  48. edit_obj.password= password
  49. edit_obj.save()
  50. """
  51. 上述方法当字段特别多的时候效率会非常的低
  52. 从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
  53. """
  54. # 跳转到数据的展示页面
  55. return redirect('/userlist/')
  56. # 将数据对象展示到页面上
  57. return render(request,'edit_user.html',locals())
  58. # 删除功能
  59. """
  60. 跟编辑功能逻辑类似
  61. def delete_user(request):
  62. # 获取用户想要删除的数据id值
  63. delete_id = request.GET.get('user_id')
  64. # 直接去数据库中找到对应的数据删除即可
  65. models.User.objects.filter(id=delete_id).delete()
  66. """
  67. 批量删除
  68. """
  69. # 跳转到展示页面
  70. return redirect('/userlist/')
  71. """
  72. # 真正的删除功能应该需要二次确认 我们这里先不做后面会讲
  73. # 删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态
  74. username password is_delete
  75. jason 123 0
  76. egon 123 1

django orm中如何创建表关系

  1. """
  2. 表与表之间的关系
  3. 一对多
  4. 多对多
  5. 一对一
  6. 没有关系
  7. 判断表关系的方法:换位思考
  8. """
  9. 图书表
  10. 出版社表
  11. 作者表
  12. 作者详情表
  13. """
  14. 图书和出版社是一对多的关系(一本图书只能有一个出版社,一个出版社可以出版多本图书) 外键字段建在多的那一方 book
  15. 图书和作者是多对多的关系(一本书可以有多个作者,一个作者可以发表多个书) 需要创建第三张表(书和作者的关系表)来专门存储
  16. 作者与作者详情表是一对一
  17. """
  18. from django.db import models
  19. # Create your models here.
  20. #创建表关系 先将基表创建出来 然后再添加外键字段
  21. #书表
  22. class Book(models.Model):
  23. title = models.CharField(max_length=32,verbose_name="书籍名称")
  24. price = models.DecimalField(max_digits=8,decimal_places=2,verbose_name="书籍价格")
  25. # 总共八位 小数点后面占两位
  26. """
  27. 图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
  28. """
  29. publish = models.ForeignKey(to='Publish',on_delete=models.DO_NOTHING)#默认就是与出版社表的关键字段做外键关联
  30. """
  31. django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:
  32. TypeError: init() missing 1 required positional argument: ‘on_delete’
  33. 注:由于多对多(ManyToManyField)没有 on_delete 参数,所以以上只针对外键(ForeignKey)和一对一(OneToOneField)
  34. on_delete=None, 删除关联表中的数据时,当前表与其关联的field的行为
  35. on_delete=models.CASCADE, 删除关联数据,与之关联也删除
  36. on_delete=models.DO_NOTHING, 删除关联数据,什么也不做
  37. """
  38. """
  39. 如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
  40. 如果你自作聪明的加了_id那么orm还是会在后面继续加_id
  41. 后面在定义ForeignKey的时候就不要自己加_id
  42. """
  43. """
  44. 图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
  45. 在mysql中需要自己单独再建立一个表 但是在orm中 只需要告诉orm谁和谁是多对多的关系 然后它自动会创建
  46. """
  47. authors = models.ManyToManyField(to='Author')
  48. """
  49. authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
  50. 让orm自动帮你创建第三张关系表
  51. """
  52. #出版社表
  53. class Publish(models.Model):
  54. name = models.CharField(max_length=32,verbose_name="出版社名称")
  55. addr = models.CharField(max_length=32,verbose_name="出版社地址")
  56. #作者表
  57. class Author(models.Model):
  58. name = models.CharField(max_length=32, verbose_name="作者名称")
  59. age = models.IntegerField(verbose_name="作者年龄")
  60. #作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
  61. author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.DO_NOTHING)
  62. """
  63. OneToOneField也会自动给字段加_id后缀
  64. 所以你也不要自作聪明的自己加_id
  65. """
  66. #作者详情表
  67. class AuthorDetail(models.Model):
  68. phone = models.BigIntegerField(verbose_name="作者手机号") #或者直接字符类型
  69. addr = models.CharField(max_length=32, verbose_name="作者地址")
  70. """
  71. orm中如何定义三种关系
  72. publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联
  73. authors = models.ManyToManyField(to='Author')
  74. author_detail = models.OneToOneField(to='AuthorDetail')
  75. ForeignKey
  76. OneToOneField
  77. 会自动在字段后面加_id后缀
  78. """
  79. # 在django1.X版本中外键默认都是级联更新删除的
  80. # 多对多的表关系可以有好几种创建方式 这里暂且先介绍一种
  81. # 针对外键字段里面的其他参数 暂时不要考虑 如果感兴趣自己可以百度试试看

django请求生命周期流程图(必会)

  1. # 每个人都要会画 这个图是你们后期复习django最好的一个梳理方式
  2. # 扩展知识点
  3. """
  4. 缓存数据库
  5. 提前已经将你想要的数据准备好了 你来直接拿就可以
  6. 提高效率和响应时间
  7. 当你在修改你的数据的时候 你会发现数据并不是立刻修改完成的
  8. 而是需要经过一段时间才会修改
  9. 博客园
  10. 了解即可
  11. """

路由层

路由匹配

  1. # 路由匹配
  2. url(r'test',views.test),
  3. url(r'testadd',views.testadd)
  4. """
  5. url方法第一个参数是正则表达式
  6. 只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
  7. 直接执行对应的视图函数
  8. 你在输入url的时候会默认加斜杠
  9. django内部帮你做到重定向
  10. 一次匹配不行
  11. url后面加斜杠再来一次
  12. """
  13. # 取消自动加斜杠(在setting中设置)
  14. APPEND_SLASH = False/True # 默认是自动加斜杠的
  15. urlpatterns = [
  16. url(r'^admin/', admin.site.urls),
  17. # 首页
  18. url(r'^$',views.home),
  19. # 路由匹配
  20. url(r'^test/$',views.test),
  21. url(r'^testadd/$',views.testadd),
  22. # 尾页(了解)
  23. url(r'',views.error),
  24. ]
  25. 现在django3换成了path访问路由路径
  26. urlpatterns = [
  27. path('admin/', admin.site.urls),
  28. #路由匹配
  29. path('',views.index),#首页
  30. path('test',views.test),
  31. path('testadd',views.testadd),
  32. ]

无名分组

  1. """
  2. 分组:就是给某一段正则表达式用小括号扩起来
  3. """
  4. url(r'^test/(\d+)/',views.test)
  5. def test(request,xx):
  6. print(xx)
  7. return HttpResponse('test')
  8. # 无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数

有名分组

  1. """
  2. 可以给正则表达式起一个别名
  3. """
  4. url(r'^testadd/(?P<year>\d+)',views.testadd)
  5. def testadd(request,year):
  6. print(year)
  7. return HttpResponse('testadd')
  8. # 有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数

无名有名是否可以混合使用

  1. """
  2. 嘻嘻 不能混用
  3. 但是同一个分组可以使用N多次
  4. """
  5. # 单个的分组可以使用多次
  6. url(r'^index/(\d+)/(\d+)/(\d+)/',views.index),
  7. url(r'^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),

反向解析

  1. # 通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数
  2. # 先给路由与视图函数起一个别名
  3. url(r'^func_kkk/',views.func,name='ooo')
  4. # 反向解析
  5. # 后端反向解析
  6. from django.shortcuts import render,HttpResponse,redirect,reverse
  7. reverse('ooo')
  8. # 前端反向解析
  9. <a href="{% url 'ooo' %}">111</a>
  10. #django3 反向解析
  11. # 先给路由与视图函数起一个别名
  12. path('func',views.func,name='xxx')
  13. # 前端反向解析
  14. <a href="{% url 'xxx' %}">111</a>
  15. # 后端反向解析
  16. from django.shortcuts import render,HttpResponse,redirect,reverse
  17. reverse('ooo')

作业

  1. """
  2. 必做题:
  3. 1.整理今日内容到博客
  4. 2.自己完成单表的增删改查功能(结合前端鼠标点点操作)
  5. 3.自己找几张表练习如何创建表与表之间的关系
  6. 选做题:
  7. 1.尝试着利用路由匹配和反向解析完成数据的编辑和删除功能
  8. 2.构思图书管理系统(后面会讲,自己先尝试着看看)
  9. """

Django学习day03随堂笔记的更多相关文章

  1. Django学习day13随堂笔记

    每日测验 """ 今日考题 1.什么是django中间件,它的作用是什么,如何自定义中间件,里面有哪些用户可以自定义的方法,这些方法有何特点 2.基于django中间件的 ...

  2. Django学习day02随堂笔记

    每日测验 """ 今日考题 1.谈谈你对web框架的认识,简述web框架请求流程 2.python三大主流web框架的区别 3.安装django需要注意的事项有哪些(最少 ...

  3. Django学习day12随堂笔记

    每日测验 """ 1.什么是cookie和session,你能描述一下它们的由来和工作机制吗(切勿糊弄,敷衍了事) 2.django中如何操作cookie和session ...

  4. Django学习day08随堂笔记

    今日考题 """ 今日考题 1.聚合查询,分组查询的关键字各是什么,各有什么特点或者注意事项 2.F与Q查询的功能,他们的导入语句是什么,针对Q有没有其他用法 3.列举常 ...

  5. Django学习day07随堂笔记

    今日考题 """ 今日考题 1.必知必会N条都有哪些,每个都是干啥使的 2.简述神奇的双下划线查询都有哪些方法,作用是什么 3.针对多对多外键字段的增删改查方法有哪些,各 ...

  6. Django学习day05随堂笔记

    每日测验 """ 今日考题 1.反向解析的本质是什么,无名和有名反向解析如何操作? 2..路由分发能够实现的前提是什么,需要注意什么,名称空间什么时候使用 3..什么是虚 ...

  7. Django学习day11随堂笔记

    今日考题 """ 今日考题 1.简述自定义分页器的使用 2.forms组件是干什么用的,它的主要功能有哪些功能,你能否具体说说每个功能下都有哪些经常用到的方法及注意事项( ...

  8. Django学习day10随堂笔记

    每日测验 """ 今日考题 1.默写ajax基本语法,及提交json数据和文件都需要添加哪些额外参数 2.什么是序列化,截止目前为止你所接触过的序列化有哪些 3.批量插入 ...

  9. Django学习day09随堂笔记

    每日测验 """ 今日考题: 1.choices参数的应用场景有哪些,如何获取该字段的值 2.django是什么模型的框架,简述MTV与MVC模型 3.多对多表关系有几种 ...

随机推荐

  1. SortCompare.time的反射版本

    "Algorithms" by Robert Sedgewick, p256, SortCompare.time(): public static double time(Stri ...

  2. 【翻译稿】Behavior Driven Development (BDD)行为驱动开发

    这是一篇翻译稿,方便给不知道BDD的同学扫盲.原文链接:What is BDD (Behavior Driven Development)? | Agile Alliance Definition定义 ...

  3. idea打断点后发现被标记的断点处那一行整行被标记了其他颜色,前面没有断点标识的红点

    问题如下: 最后发现有两种解决办法吧,直接走起! 第一种方法: 在View====>Active Editor====>Show Gutter Icons,勾选此选项,发现小红点出来了: ...

  4. javascript(js)反转字符串

    网上看到的都是这个写法较多: str.split('').reverse().join(''); 这里发现一个ES6的写法也可以达到同样的效果: Array.from(str).reverse().j ...

  5. C#多线程实践-锁和线程安全

    锁实现互斥的访问,用于确保在同一时刻只有一个线程可以进入特殊的代码片段,考虑下面的类: class ThreadUnsafe { static int val1, val2; static void ...

  6. springmvc学习日志四

    一.回顾 1.文件上传 1.1引入fileupload的jar包 1.2在springmvc的配置文件中引入CommonsMutilpartResolver文件上传解析器 1.3在控制层在写入代码 2 ...

  7. java多线程的一些面试题

    8.callable与fature Callable与Runnable类似,但是Callable有返回值,并且有一个参数化的类型. Fature保存异步计算的结果.9.执行器 Executor.10. ...

  8. EL表达式学习(二)

    1.从特定域中获取值: 2.从请求页面的input标签中,获取值:(同servlet中的getParameter和getParameterValues): 3.获取请求头(同servlet中的getH ...

  9. C程序设计学习笔记(完结)

    时间:2015-4-16 09:17 不求甚解,每有会意,欣然忘食.学习的过程是痛苦的 第1章    程序设计和C语言     第2章    算法--程序的灵魂   -算法的五个特点          ...

  10. Linux 单实例oracle安装步骤

    一.查看逻辑盘大小,执行 lsblk 二.查看硬盘及分区信息 ,执行 fdisk -l 三.将物理硬盘分区初始化为物理卷,以便LVM使用 ,创建pv pvcreate /dev/sdb 四.查看物理卷 ...