安装django

  • 终端执行并安装django
    1
    pip install django
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    c:\python3.9
    -python.exe
    -bin
    -script
    -pip.exe
    -django-admin.exe (工具,帮助创建django项目)
    -lib
    -内置模块
    -site-packages
    - openpyxl
    - flask
    - django (框架的源码)

创建项目

  • 打开pycharm进入创建django文件
  • 出现类似目录即为创建成功(不同版本略有不同)

还有一种命令行创建的,命令行创建的是最标准的,不会有templates目录,pycharm会自动帮助我们创建templates目录

我们学习的时候使用的最标准的templates目录

  • 删除templates目录
  • pycharm还在settings.py中自动生成了一句话
  • 修改成如下(直接删除)

打开终端

  • 默认已经进入我们的文件
  • 输入命令即可完成创建
    1
    python manage.py startapp app01

djangoProject默认文件介绍

1
2
3
4
5
6
7
8
djangoProject
- manage.py (项目的管理,启动项目,创建app,数据管理)(不需要修改)(常用)
- djangoProject (与项目同名)
- _init_,py
- settings.py (项目配置) (经常常修改)
- urls.py (URL和python函数的对应关系)(经常修改)
- asgi.py (接收网络请求)(不需要修改)
- wsgi.py (接收网络请求)(不需要修改)
  • app的项目目录
1
2
3
4
5
6
- 项目
- app,用户管理 (表结构,函数,HTML模板,css)(各自独立,相互不影响)
- app,订单管理 (表结构,函数,HTML模板,css)
- app,后台管理 (表结构,函数,HTML模板,css)
- app,网页
- app,API
  • app01文件目录
1
2
3
4
5
6
7
8
9
- app01
- _init_.py
- admin.py (固定不用动) django提供了默认的admin后台管理
- apps.py (固定不用动) app启动类
- migrations.py (固定不用动) 数据库变更记录
- _init_.py
- models.py (常用) 对数据库操作
- tests.py (固定不用动) 单元测试
- views.py (常用) 写函数
  • 创建项目并注册

    安装django,在pycharm中创建项目文件夹,终端输入python manage.py startapp app01 完成创建

    在settings.py中注册app,INSTALLED_APPS中的名字与app.py相对应

  • 页面创建

    编写url和视图函数的对应关系,urls.py中写页面网址入口,views中写视图函数

    通过访问对应的url即可看到不同的返回

    在templates中根据app的注册顺序,逐一在templates寻找他们html文件

  • 静态文件

    开发过程中一般将图片,css,js都当作静态文件处理放在static目录下并引用

  • 请求和响应

    • GET
    • POST
  • 数据库操作

    Mysql数据库+pymysql

    Django内部提供了ORM框架,ORM会帮我们将写下的代码翻译成sql语句,再去执行

    安装第三方模块pip install mysqlclient

    Django连接数据库

    在setting.py中的DATABASES中配置数据库

    django的models.py中创建表,创建好之后使用以下的命令进行书信

    1
    2
    >python manage.py makemigrations
    >python manage.py migrate

快速上手

注册app

  • 这里的名字需要和app.py里的对应

编写url和视图函数的对应关系

  • urls.py,导入views,修改对应关系
  • viwes.py,编写视图函数

启动django项目

  • 命令行启动
    1
    python mange.py runserver
  • pycharm启动
  • 提示url不对
  • 修改URL,完成启动

至此,我们已经创建并运行了一个最简单的django项目

页面创建

  • urls.py中写页面路径,views.py中写页面函数
  • 分别访问这三个页面可以看到不同的返回

templates目录

  • 默认在app的目录下的templates目录寻找user_list.html(根据app的注册表顺序,逐一去他们的templates的目录寻找)

静态文件

  • 在开发过程中一般将:图片,css,js都当作静态文件处理。
  1. static目录
    在app目录下创建static文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户列表</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap3/css/bootstrap.css' %}">
<link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<h1>用户列表</h1>

<input type="button" class="btn btn-primary" value="提交">

<script src="{% static 'js/jquery-3.6.1.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap3/js/bootstrap.js' %}"></script>
</body>
</html>

模板语法

本质上:在HTML中写一些占位符,由后台返回的数据对这些占位符进行替换和处理。

  • 视图函数中的render内部

    • 读取含有模板语法的HTML文件
    • 内部进行渲染,最终得到只包含HTML标签的字符串
    • 最后将渲染完成的字符串返回给用户浏览器
  • 数据替换

  • if语法

请求和响应

请求

  • 获取请求方式 GET/POST
    1
    print(request.method)
  • 在url上传递值
    1
    print(request.GET)
  • 在请求体中提交数据
    1
    print(request.POST)

    响应

  • 内容字符串返回给请求者
1
return HttpResponse("返回")
  • 读取HTML的内容+渲染 ——> 将字符串内容返回给用户浏览器

    1
    return render(request, 'something.html',{"title": "来了"})
  • 让浏览器重定向到其他页面

    1
    return redirect("https://www.baidu.com")

案例:用户登录

  • url对应关系
  • views.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import requests
    from django.shortcuts import render, HttpResponse, redirect

    def login(request):
    if request.method == "GET":
    return render(request, "login.html")
    # 如果是POST请求,获取用户提交的数据
    # print(request.POST)
    username = request.POST.get("user")
    password = request.POST.get("pwd")
    if username == "root" and password == "123":
    return HttpResponse("登录成功")
    # return HttpResponse("登陆失败")
    return render(request, 'login.html',{"error_msg": "用户名或密码错误"})
  • login.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>

    <h1>用户登录</h1>
    <form method="post" action="/login/">

    {% csrf_token %}

    <input type="text" name="user" placeholder="用户名">
    <input type="password" name="pwd" placeholder="密码">
    <input type="submit" value="提交">
    <span style="color: red">{{ error_msg }}</span>
    </form>

    </body>
    </html>

  • CSRF 相当于多了一层验证

  • 在form表单中加上一句

数据库操作

  • MySQL数据库+pymysql

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import pymysql

    # 连接mysql
    conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", password="root", charset='utf8', db='bkys')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)


    # 发送指令(不要用字符串格式化做sql的拼接,安全隐患sql注入)
    cursor.execute("insert into admin(username,password,mobile) values('bkys','adawd','2131153245')")
    con.commit()

    # 关闭
    cursor.close()
    conn.close()
  • 在models中写如下类

    1
    2
    class Department(models.Model):
    title = models.CharField(max_length=16)
  • 执行命令

    1
    2
    python manage.py makemigrations
    python manage.py migrate

安装第三方模块

1
pip install mysqlclient
  • 安装成功

ORM

ORM会帮我们将写下的代码翻译给sql语句,再去数据库执行

  • 创建,修改和删除数据库中的表。(无法创建数据库)
  • 操作表中的数据(不用写SQL语句)
  1. 创建数据库
  • 启动MySQL服务
  • 创建数据库
  1. django连接数据库
    在 settings.py文件中配置
  • 注释原来的

django操作表

创建表

  • 在models.py中
1
2
3
4
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
  • 这就相当于sql中的
1
2
3
4
5
6
create table app01_userinfo(
id bigint auto_increment primary key,
name varchar(32),
password varchar(64),
age int
)
  • 执行命令
    前提:app已经注册
    1
    2
    python manage.py makemigrations
    python manage.py migrate
    执行完命令出现如下字样即为成功
  • 此时查看数据库
  • 新增表时,在models.py中新增类即可,然后执行命令
  • 当需要在创建成功的表中修改时候
    • 删除:注释后执行命令
    • 新增:由已存在列中可能由数据,所以需要指定新增对应的数据
      • 手动输入一个值
      • 类中定义一个默认值
        1
        size = models.IntegerField(default=1)
      • 允许可以为空
        1
        size = models.IntegerField(null=True, blank=True)

对表中的数据进行操作

  • 新建

    1
    Department.objects.create(title="qwe")
  • 删除

    1
    2
    Department.objects.filter(id=1).delete()  # 删除id为1
    Department.objects.all().delete() # 删除表中所有数据
  • 获取数据
    data_list = [行(对象),行(对象),行(对象)] QuerySet类型

    1
    2
    3
    data_list = Department.objects.all()   # 获取所有数据
    for obj in data_list:
    print(obj.id, obj.title)
  • 更新数据

1
2
Department.objects.all().update(title="aaa")  # 更新所有
Department.objects.filter(id="1").update(title="aaa") # 更新某行

案例:用户管理

  1. 展示用户列表
  • url
  • 函数
    • 获取所有用户数据
    • HTML渲染
  1. 添加用户列表
  • url
  • 函数
    • GET,看到页面,输入内容
    • POST,提交,写入数据库
  1. 删除用户
  • url
  • views.py函数
1
2
3
4
def info_delete(request):
nid = request.GET.get('nid')
UserInfo.objects.filter(id=nid).delete()
return HttpResponse("删除成功")

用户管理界面

进行优化,使得添加和删除在一个页面

  • models.py
1
2
3
4
5
6
from django.db import models

class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
  • views.py
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
from django.shortcuts import render, HttpResponse, redirect, redirect
from requests import request

from app01.models import UserInfo
def info_list(request):
# 创建数据
# UserInfo.objects.create(name="bkys", password="123", age="20")
# 获取数据库中的所有用户信息
data_list = UserInfo.objects.all()
print(data_list)

return render(request, "info_list.html", {"data_list": data_list})

def info_add(request):
if request.method == "GET":
return render(request, "info_add.html")
user = request.POST.get("user")
pwd = request.POST.get("pwd")
age = request.POST.get("age")

# 添加到数据库
UserInfo.objects.create(name=user, password=pwd, age=age)

# 自动跳转
return redirect("/info/list/")


def info_delete(request):
nid = request.GET.get('nid')
UserInfo.objects.filter(id=nid).delete()
return redirect("/info/list/")
  • info_add.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post">

{% csrf_token %}

<input type="text" name="user" placeholder="用户名">
<input type="text" name="pwd" placeholder="密码">
<input type="text" name="age" placeholder="年龄">

<input type="submit" value="提交">
</form>

</body>
</html>
  • info_list.html
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<a href="/info/add/">添加</a>
<table border="1">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>pwd</th>
<th>age</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in data_list %}
<tr>
<td>{{ obj.id }}</td>
<td>{{ obj.name }}</td>
<td>{{ obj.pwd }}</td>
<td>{{ obj.age }}</td>
<td>
<a href="/info/delete/?nid={{ obj.id }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
  • 如下所示