初始 Django
- Python 知识点:函数,面向对象
- 前端开发:HTML,CSS,JavaScript,jQuery,BootStrap
- MySQL 数据库
- Python 的 WEB 框架
- Flask:轻量化,第三方组件
- Django:比较大,集成很多组件,也可以使用第三方组件
1. 安装 Django
pip3 install django==3.2 -i http://mirrors.ai
C:\Python3
- python.exe
- Scripts
- pip.exe # 基于pip可以安装第三方组件
- django-admin.exe # 安装django生成的,【工具,创建django项目】
- Lib
- 内置模块
- sit-packages # 防止第三方安装的模块
- openpyxl
- flask
- Django # 【框架源码】
2. 创建项目
2.1 在终端
- 打开终端
- 进入某个目录(项目放在那里)
- 执行命令创建项目
django-admin startproject 项目名称
2.2 Pycharm
特殊说明
- 命令行:创建的项目是标准的
- pycharm:在标准的基础上添加了一些东西
- 创建了一个templates目录
- 在settings文件里面加了许多数据:
os.path.join
添加了这个模版的位置
├── django_从入门实战 【与项目同名】
│ ├── __init__.py
│ ├── settings.py 【配置文件】 【===常操作===】
│ ├── urls.py 【URL和python函数的对应关系】 【===常操作===】
│ ├── asgi.py 【接收网路请求,不需要修改】 django3 异步
│ └── wsgi.py 【接收网络请求,不需要修改】 同步式的
└── manage.py 【项目的管理,启动项目,创建app,数据管理,不需要修改】 【===常操作===】
3. 创建APP
- 项目
- app,用户管理【表结构,函数,HTML模块,CSS】
- app,订单管理【表结构,函数,HTML模块,CSS】
- app,后台管理【表结构,函数,HTML模块,CSS】
- app,网站 【表结构,函数,HTML模块,CSS】
- app,API 【表结构,函数,HTML模块,CSS】
创建APP
cd <项目地址>
python manage.py startapp app01
生成后的目录结构
├── app01
│ ├── __init__.py
│ ├── admin.py 【固定,不用动】 django默认提供了admin后台管理
│ ├── apps.py 【固定,不用动】 app启动类
│ ├── migrations 【固定,不用动】 数据库变更记录
│ │ └── __init__.py
│ ├── models.py 【重要】,对数据库进行操作的
│ ├── tests.py 【固定,不用动】 单元测试
│ └── views.py 【重要】,视图函数
├── django_从入门实战
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-39.pyc
│ │ └── settings.cpython-39.pyc
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py 【 URL --> 函数 】
│ └── wsgi.py
└── manage.py
4. 快速上手
- 确保APP已注册【settings.py】
在setting文件中注册app
INSTALLED_APPS=[ 'app01.apps.App01Config' ]
- 编写URL和视图函数对应关系【urls.py】
- 编写视图函数
- 启动django项目
- 通过命令行启动
python manage.py runserver
- Pycharm启动
4.1 HttpResponse
返回字符串:reutrn HttpResponse("欢迎页面")
4.2 templates模版(render)
返回一个模版或者html页面,需要使用render
.
python # 1. 在settings设置了DIRS参数,优先去项目根目录的templates寻找 # 2. 根据app的注册顺序,在每个app下的templates目录找 # 3. 如果settings没有设置DIRS,默认在当前目录下的templates寻找 return render(request, "user_list.html")
4.3 静态文件
一般将css,js,image,或者插件都会当作静态文件处理。
静态文件放置的位置:app目录下的static
目录里面
目录结构:
```text
├── app01
│ ├── static
│ │ ├── css
│ │ ├── img
│ │ ├── js
│ │ └── plugins
```
静态文件的引用的写法
```html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>This is a user_list</title>
<link rel="stylesheet" href="{% static 'plugins/...../....css' %}">
</head>
<body>
<h1>这是用户列表</h1>
<script src="{% static 'js/xxx.js' %}"></script>
<script src="{% static 'css/xxx.css' %}"></script>
</body>
</html>
```
![静态文件引用](https://oss.moniter.top/uPic/2022-03-28/NjJYP8.png)
5. 模版语法
本质上:在HTML中写一些占位符,有数据对这些占位符进行替换和处理 模块的用法:
- 获取单独的一个值:
{{ n1 }}
. 引用函数里面的变量 - 获取列表的值
{{ n2.0 }}
. 引用函数里面的列表的索引 - 获取字典的值
{{ n3.key }}
. 引用函数里面的字典的key - 模版中的循环语句
{#列表循环#}
<div>
{% for item in n2 %}
<span>{{ item }}</span>
{% endfor %}
</div>
{#字典循环#}
<ur>
{% for item in n3.values %}
<li>{{ item }}</li>
{% endfor %}
</ur>
<ur>
{% for item in n3.keys %}
<li>{{ item }}</li>
{% endfor %}
</ur>
<ur>
{% for key,value in n3.items %}
<li>{{ key }}:{{ value }}</li>
{% endfor %}
</ur>
{#列表里面套字典循环#}
{{ n4.1 }}
{{ n4.1.name }}
{{ n4.1.role }}
{% for item in n4 %}
<div>{{ item.name }}:{{ item.age }}:{{ item.role }}</div>
{% endfor %}
- 模版中的条件语句
{% if n1 == "zhang" %}
<div>yes</div>
{% else %}
<div>no</div>
{% endif %}
案例
6. 请求和响应
- request:是一个对象,封装了用户发送过来的所有请求相关数据
# 1.获取请求方式 GET/POST/PUSH/DELETE
print(request.method)
# 2. 在URL上传递一些值
print(request.GET)
# 3. 通过请求体提交数据
print(request.POST)
# 4. 【响应】HttpResponse("返回内容") 将字符串内容返回给请求体
# return HttpResponse("返回内容")
# 5.【响应】使用render,读取HTML内容 + 渲染 --> 字符串 返回给用户数据
# return render(request, 'something.html', {"title": "来了"})
# 6.【响应】 redirect()返回:让浏览器重定向到其他页面
return redirect("https://www.baidu.com")
关于重定向。 用户发送请求到网站,网站返回一个网址给浏览器,浏览器在去访问获得的地址进行访问
在Django进行表单的时候存在下面的报错
问题原因:在Django中存在一个CSRF的校验 解决方法:在网页的表单前面加入`{% csrf_token %} 例子如下<form method="post" action="/login/">
{% csrf_token %}
<input type="text" name="user" placeholder="用户名">
<input type="password" name="password" placeholder="密码">
<input type="submit" value="提交"/>
</form>
7. 数据库操作
- MySQL数据库 + pymysql
- pymysql集合到Django或者Flask都是可以的
- 但是在Django中,一般不会用pymysql去操作数据库
- Django开发中,操作数据库一般使用的是:内部提供的ORM框架
- ORM框架的简单示意图
7.1 安装第三方模块
pip3 install mysqlclient
7.2 ORM
ORM 可以帮助我们做的两件事
- 创建修改和删除数据库中的表(不用写SQL语句) 【无法创建数据库】
- 操作表中的数据,不用写SQL语句
1. 创建数据库
步骤:
- 启动MySQL服务(命令行,其他第三方软件)
- 创建数据库
create database django_day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
2. django连接数据库
在settings.py文件中进行配置和修改
# settings.py
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_day15', # 数据库名字
'USER': 'root',
'PASSWORD': 'wlh10261003',
'HOST': '119.29.100.160',
'PORT': '3306'
}
}
3. django操作数据库
- 创建表
- 删除表
- 更新表
在models.py里面创建ORM模型
对应的sql语句为create table app01_usermodel(
id bigint auto_increment primary key,
name varchar(32),
password varchar(64),
age int
)
执行命令
python3 manager.py makemigrations
python3 manager.py migrate
注意:app需要提前注册
在表中新增列时,由于表中已经存在数据,所以在新增列必须要指定新增列对应的数据
- 手动输入一个值
- 设置默认值
age = models.IntegerField(default=0)
- 设置允许为空
age = models.IntegerField(null=True,blank=True)
在开发中对表结构进行调整,只需要在models中操作类即可,然后执行下面的命令
python3 manager.py makemigrations
python3 manager.py migrate
4. 操作表中的数据
新建 添加数据
from app.models import DepartModel,UserModel
DepartModel.objects.create(title="运维部")
DepartModel.objects.create(title="运营部")
DepartModel.objects.create(title="研发部")
DepartModel.objects.create(title="人力资源部")
UserModel.objects.create(name="张三",password="123456",age=26)
UserModel.objects.create(name="李四",password="123456",age=37)
UserModel.objects.create(name="王五",password="123456")
删除 数据
from app.models import DepartModel,UserModel
UserModel.objects.filter(id=1).delete()
UserModel.objects.all().delete()
DepartModel.objects.all().delete()
筛选/获取 数据
from app.models import UserModel
# 得到的是一个QuerySet类型,就是[对象,行,行]
data_list = UserModel.objects.all() # 获取所有
for obj in data_list:
print(obj.name,obj.password,obj.age)
# 通过下面的方式也是获取的一个QuerySet的类型数据 [对象,]
data_list = UserModel.objects.filter(id=5)
print(data_list)
# 可以通过下面的方式,直接获取一个查询到的对象
data_object = UserModel.objects.filter(id=5).first()
print(data_object)
print(data_object.name, data_object.password, data_object.age)
更新数据
from app.models import UserModel
UserModel.objects.all().update(password="999")
UserModel.objects.filter(id=4).update(age=54)
案例:用户管理
1. 展示用户列表
- url
- 函数
- 获取所有用户列表
- 渲染
具体代码实例
- info_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户管理</title>
</head>
<body>
<h1>INFO 列表</h1>
<a href="/info/add">添加用户</a>
<table border="1">
<thread>
{# tr:表示行#}
<tr>
<th>ID</th>
<th>用户</th>
<th>密码</th>
<th>年龄</th>
</tr>
</thread>
<tbody>
{% for obj in data_list %}
<tr>
<td>{{ obj.id }}</td>
<td>{{ obj.name }}</td>
<td>{{ obj.password }}</td>
<td>{{ obj.age }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
-
views.info_list
-
urls.py
2. 添加用户
- url
- 函数
- GET:看到页面,
- POST:提交,写入到数据库
3. 删除用户
- url
- 函数
本文来自博客园,作者:Lin-Grocery,转载请注明原文链接:https://www.cnblogs.com/moniter/articles/chu-shi-django.html