01-03 简单了解django框架 - 图1


主题:登陆功能

  • 静态文件配置
  • request对象方法
  • pycharm如何链接MySQL
  • django如何链接MySQL
  • django orm简介(重点)
  • 数据的CURD
  • 数据库同步命令
  • orm创建外建关系
  • django请求生命周期流程图

一、静态文件配置

我们之所以能够在浏览器地址栏里面输入网址就可以拿到对应的资源 是因为开发者早已经提前开设了该资源的访问接口

01-03 简单了解django框架 - 图2 01-03 简单了解django框架 - 图3

1. 静态文件

  • 所谓静态文件就是 在写好之后不会自动动态改变的文件资源 比如我们写好的css文件、js文件、图片文件、第三方架构文件
  • 我们默认将所有静态文件都放在一个static文件夹内
  • 我们需要自己在django目录下创建该文件
    • static目录下基本还会再分几个文件夹
      • css
      • js
      • img
      • 第三方文件资源

01-03 简单了解django框架 - 图4

2. 配置

  • 在html中添加文件路径,我们可以用点的方式添加文件路径,但是dj给我们提供了更方便的方法

image.png

  • 如果如上配置的话,那么就需要在配置文件里把static的文件路径做好

    1. # 静态文件配置
    2. STATICFILES_DIRS = [
    3. os.path.join(BASE_DIR, 'static')
    4. ]

    01-03 简单了解django框架 - 图6

    1. 如果你想要访问静态文件资源,那么必须以static开头
    2. <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    3. 你书写了接口前缀之后 就拥有了访问下列列表中所有文件夹内部资源的权限
  • 那么问题来了:如果后期想要修改接口前缀的名字 那就要把所有的配置都修改 那样就太麻烦了

    • 解决问题的方法:动态解析

      3. 动态解析

  1. {% load static %} # 相当于导入模块
  2. <script src="{% static '/jquery_3.5.1.js' %}"></script>
  3. <link rel="stylesheet" href="{% static '/bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
  4. <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

01-03 简单了解django框架 - 图7

  • 通过动态解析的方式修改完之后 不论setting静态配置文件怎么修改接口前缀 都没关系了

01-03 简单了解django框架 - 图8

二、request 对象方法

1. 前期准备

  1. # urls.py
  2. urlpatterns = [
  3. url(r'^admin/', admin.site.urls),
  4. url(r'^login/', views.login),
  5. ]
  1. # vivews.py
  2. from django.shortcuts import render, HttpResponse, redirect
  3. # Create your views here.
  4. def login(request):
  5. print('触发了')
  6. return render(request,'login.html')
  1. # login.html
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  8. <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
  9. <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
  10. </head>
  11. <body>
  12. <div class="container">
  13. <div class="row">
  14. <h1 class="text-center">用户登陆</h1>
  15. <div class="col-md-8 col-md-offset-2">
  16. <form action="" method="post">
  17. <p>username:<input type="text" name="username" class="form-control"></p>
  18. <p>password:<input type="password" name="password" class="form-control"></p>
  19. <input type="submit" class="btn btn-success btn-block">
  20. </form>
  21. </div>
  22. </div>
  23. </div>
  24. </body>
  25. </html>

2.如何获取用户输入的数据

  • 我们在浏览器的url窗口点击会车 就触发了该url的get方法

01-03 简单了解django框架 - 图9
01-03 简单了解django框架 - 图10

  • 我们点击提交会触发post请求

01-03 简单了解django框架 - 图11
01-03 简单了解django框架 - 图12

  • 由此得知不管是get还是post请求都会触发login函数
  • 那我们想要接收到用户的数据那就要用判断来实现 ```python from django.shortcuts import render, HttpResponse, redirect

Create your views here.

def login(request): if request.method == ‘POST’: # 这里request.method得到的是一个大写的字符串 print(request.POST) # username = request.POST.get(‘username’) password = request.POST.get(‘password’) print(username, password) # xio 123 if username == ‘xio’ and password == ‘123’: return HttpResponse(‘登陆成功,恭喜🎉’)

  1. return render(request, 'login.html')
  1. ![](https://cdn.nlark.com/yuque/0/2021/png/12472135/1615807339260-4fa10c76-3502-4a03-b600-689989f49530.png#align=left&display=inline&height=355&margin=%5Bobject%20Object%5D&name=&originHeight=710&originWidth=1552&size=0&status=done&style=none&width=776)<br />![](https://cdn.nlark.com/yuque/0/2021/png/12472135/1615807374733-89186389-e194-49cb-9c0b-8bd209f93254.png#align=left&display=inline&height=163&margin=%5Bobject%20Object%5D&name=&originHeight=326&originWidth=720&size=0&status=done&style=none&width=360)
  2. <a name="BwDya"></a>
  3. ## 3. 总结
  4. ```python
  5. 1.form表单回顾
  6. form表单默认使用的是get请求
  7. action
  8. 控制后端提交的路径
  9. 1.不写:默认朝当前页面地址提交数据
  10. 2.后缀:/index/
  11. 3.全写:https://www.mzitu.com
  12. method
  13. get
  14. post
  15. 2.request对象方法
  16. request.method
  17. 获取当前请求的请求方法并且结果是一个纯大写的字符串类型
  18. request.POST # 直接看成是字典即可
  19. 获取用户提交post请求过来的基本数据(不包含文件)
  20. get() # 获取列表最后一个元素
  21. getlist() # 获取整个列表
  22. request.GET # 直接看成是字典即可
  23. 获取url问好后面的数据
  24. get() # 获取列表最后一个元素
  25. getlist() # 获取整个列表
  26. request.FILES # 直接看成是字典即可
  27. 获取用户上传的文件数据
  28. '''form表单如果需要携带文件数据 那么要添加参数
  29. <form action="" method="post" enctype="multipart/form-data">
  30. '''
  31. get() # 获取列表最后一个元素
  32. getlist() # 获取整个列表

三、django连接MySQL

  • django默认使用自带的sqlite3
  • 一定要把默认使用的DATABASES给注销掉

    1. 配置文件修改配置

    ```python

DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, ‘NAME’: ‘db1’, # 一定要事先创建好才能指定 ‘HOST’: ‘127.0.0.1’, ‘PORT’: 3306, ‘USER’: ‘root’, ‘PASSWORD’: ‘zdyzdy’, ‘CHARSET’: ‘utf8’ } }

  1. <a name="gQiHu"></a>
  2. ## 2. 在项目文件夹或者应用文件夹内的__init__.py文件中书写固定的代码'
  3. ```python
  4. import pymysql
  5. pymysql.install_as_MySQLdb()

四、 用pycharm查看MySQL数据库

01-03 简单了解django框架 - 图13
01-03 简单了解django框架 - 图14
01-03 简单了解django框架 - 图15
01-03 简单了解django框架 - 图16

五、django orm简介

  1. """
  2. orm:对象关系映射
  3. """
  4. orm目的就是为了能够让不懂SQL语句的人通过python面向对象的知识点也能够轻松自如的操作数据库
  5. >>>
  6. 对象 >>> 表里面的数据
  7. 对象点属性 >>> 字段对应的值
  8. # 缺陷:sql封装死了 有时候查询速度很慢

1. orm实操

1.1 创建表

  • 我们的模型类需要写在应用下的models.py文件中

    1. class User(models.Model):
    2. # id int primary key auto_increment
    3. id = models.AutoField(primary_key=True)
    4. # name varchar(32)
    5. name = models.CharField(max_length=32) # CharField必须要加max_length参数
    6. # age int
    7. age = models.IntegerField()

    1.2 数据库迁移命令

    1. 1.将数据库修改操作先记录到小本本上(对应应用下的migrations文件夹)
    2. python3 manage.py makemigrations
    3. 2.真正的执行数据库迁移操作
    4. python3 manage.py migrate
    5. # 只要动了models.py中跟数据库相关的代码就必须重新执行上述两条命令

    01-03 简单了解django框架 - 图1701-03 简单了解django框架 - 图18

  • 也可以通过这里简写代码 makemigrations migrate

1.3 针对主键字段

  1. class User1(models.Model):
  2. # 如果你不指定主键 那么orm会自动帮你创建一个名为id的主键字段
  3. # 如果你想让主键字段名不叫id 叫uid、sid、pid等则需要自己手动指定
  4. username = models.CharField(max_length=32)

2. 字段的增删改查

  1. # 增
  2. # 增加字段的时候会报错,解决方案有两种,要么指定字段可以为空,要么给一个默认值
  3. pwd = models.IntegerField('密码',null=True) # 该字段可以为空
  4. is_delete = models.IntegerField(default=0) # 默认值
  5. # 改
  6. 直接改代码然后执行数据库迁移命令即可
  7. # 删
  8. 注释掉代码然后执行数据库迁移命令即可

3. 数据的增删该查

  1. # 1.查询数据
  2. # select * from user where name=username;
  3. user_obj = models.User.objects.filter(name=username).first()
  4. # 2.添加数据
  5. # insert into user(name,pwd) values(username,password);
  6. models.User.objects.create(name=username,pwd=password)
  7. # 3.查询所有的数据
  8. # select * from user;
  9. models.User.objects.all() # [obj1,obj2,obj3,obj4]
  10. # 4.修改数据
  11. models.User.objects.filter(id=edit_id).update(name=username,pwd=password)
  12. edit_obj.name = username
  13. edit_obj.pwd = password
  14. edit_obj.save()
  15. # 5.删除数据
  16. models.User.objects.filter(id=delete_id).delete()

六、数据库同步命令

  • 如果数据库里面已经有一些表,我们如何通过django 进行orm操作
  • 首先执行一下数据库迁移命令 完成链接

    1. python3 manage.py makemigrations
    2. python3 manage.py migrate
    3. python3 manage.py inspectdb
  • 然后把inspectdb形成的代码拷贝到models里

    七、orm创建外建关系

    ```python “”” 1.表与表之间的关系 一对多 一对一 多对多 2.表关系的判断 换位思考 “”” 书籍表

出版社表

作者表

ORM针对外键字段的创建位置

  1. 一对多
  2. 推荐建在多的一方

一对一 建在任何一方都可以,但是推荐建在查询频率较高的表中 多对多 1.自己建表 2.建在任何一方都可以,但是推荐建在查询频率较高的表中

class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_places=2) # 总共8位 小数占2位

  1. # 出版社外键
  2. publish = models.ForeignKey(to='Publish') # 默认就是主键
  3. """自动在外键字段后面加_id后缀"""
  4. # 作者外键
  5. authors = models.ManyToManyField(to='Author') # 自动帮你创建书籍和作者的第三张表
  6. """虚拟字段不会在表中实例化出来 而是告诉ORM创建第三张关系表"""

class Publish(models.Model): title = models.CharField(max_length=32) email = models.EmailField()

class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() author_detail = models.OneToOneField(to=’AuthorDetail’) “””自动在外键字段后面加_id后缀”””

class AuthorDetail(models.Model): phone = models.BigIntegerField() addr = models.CharField(max_length=128) ```