0 django 学习参考资料
1 快速搭建django 项目:https://blog.csdn.net/Ans_min/article/details/123146335
2 django mvc 介绍详见 https://www.jb51.net/article/107884.htm
3 django 各个 目录 文件结构 什么意思详见: https://www.jb51.net/article/278803.htm#_label2
https://www.knowledgedict.com/tutorial/django-template.html#%E6%A8%A1%E6%9D%BF%E6%96%87%E4%BB%B6%E5%AD%98%E6%94%BE%E4%BD%8D%E7%BD%AE
1 pip install 安装
1.1 安装
pip install django
1.2 django-admin.exe 简介
pip 安装完成后,会生成 该exe文件, 用于操作django项目,其目录结构如下。
2 创建django项目
2.1 命令行 和 pycharm 两种方式:
1 命令行:通过 django-admin.exe 来创建项目: django-admin.exe startproject django项目名
2 pycharm : 略,详见 2.2 快速搭建django 项目:https://blog.csdn.net/Ans_min/article/details/123146335
2.2 项目目录结构介绍
djangoProject
│─ manage.py 【项目管理的脚本,不要修改,eg:启动、创建app、数据库管理等】
└─djangoProject 【与项目同名的文件夹】
│─ asgi.py 【和wsgi.py一起,接收网络请求的】【不用修改】【Django接收异步的】
│─ settings.py 【项目的配置文件,eg:数据库连接信息、注册app等】【常操作】
│─ urls.py 【全部的URL和函数的对应关系】【常操作】
│─ wsgi.py 【和asgi.py一起,接收网络请求的】【不用修改】【Django接收同步的】
│─ __init__.py
3 创建app(功能模块的意思)
cmd 切换到 当前项目路径下,执行命令 python manage.py startapp app名
3.1 app 目录结构介绍
djangoProject
│ manage.py
├─djangoProject
│ asgi.py
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py
└─app_test 【app名命名的文件夹】
│ admin.py 【固定的不用动】django默认提供的后台管理,但实际开发不常用
│ apps.py 【固定的不用动】app启动相关
│ models.py 【☆很重要,对数据库进行操作】这里不用SQL写了,Django封装了ORM供调用
│ tests.py 【固定的不用动】用来单元功能测试的,个人小项目可以不用管
│ views.py 【☆很重要,撰写视图函数(得我们自己写的)】
│ __init__.py
└─migrations 【固定的不用动】数据库变更记录,会自动生成文件,我们不用动
__init__.py
3.2 注册app
想要创建的 app生效,需要在settings.py 文件中 引入。
app创建完成后,apps.py文件自动生成的内容如图,需要将该类引入到 settings.py INSTALLED_APPS=[] 中,app才生效
# settings.py 文件
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app_test.apps.AppTestConfig', # 这里引入的app_test模块
]
4 django 快速上手
django项目运行起来还需要 以下几方面的操作
4.1 urls.py 和 view.py视图方法的映射
web 界面调用 uri 的时候 映射到view.py 文件中相对应的方法
urls.py 配置
urlpatterns = [
path('admin/', admin.site.urls),
path('app_test_index/', views.test_index), # path()方法中的第一个参数是web页面访问url中的uri部分,(https:ip/uri), 第二个参数 是view.py 文件中的 def test_index 方法。**该方法需要自己在 view.py 中定义**
]
path(‘app_test_index/’, views.test_index), # path()方法中的第一个参数是web页面访问url中的uri部分,(https:ip/uri), 第二个参数 是view.py 文件中的 def test_index 方法。该方法需要自己在 view.py 中定义
view.py 配置
from django.shortcuts import render
def test_index(request): # request 参数必须写
return render(request, 'app_test.html')
render() 中,第一个参数,就是 传入的 request, 第二个参数是返回的 html 文件, 这里的 html 文件也是自己创建的
render() 中,第一个参数,就是 传入的 request, 第二个参数是返回的 html 文件, 这里的 html 文件也是自己创建的
这个html 在哪里创建呢? 引入 模板文件和静态文件的概念
4.2 模板文件和静态文件
比如: 我们想在 项目根目录下 存放我们的 模板文件templates 和 静态文件 static_files
模板文件 就是 项目中的 templates目录,用于存放 html 文件
静态文件 就是 项目中的 static_files 目录,用于存放 js css 图片等资源
4.2.1 模板文件路径设置
settings.py 文件中 的 TEMPLATES 代码块 的 DIRS 便是 templates 的路径,
默认情况下 是在项目根目录的 templates目录下 ,
BASE_DIR = Path(file).resolve().parent.parent 表示的就是 项目根目录
BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
4.2.2 静态文件路径设置
settings.py 文件中 STATIC_URL = ‘static/’ 后边 增加 如下代码
STATICFILES_DIRS = [
os.path.join(BASE_DIR / 'static_files')
]
其中 STATIC_URL = ‘static/’ 中的 static/ 是 html 文件中路径的引用指针 ,其值等于下方STATICFILES_DIRS的静态文件路径,不代表静态文件的存放路径,可以任意命名, 只是为了 html 调用方便,举个例子如下:
tasks.html 中引用静态文件 static_files/img/h1_h2.png
我们settings.py 文件中 STATIC_URL 配置为 ‘static1/’
STATICFILES_DIRS 中配置上 static_files 目录
启动django 项目,web页面访问tasks.html,查看源html 可以看到渲染出来的引用路径是 /static1/img/h1_h2.png
这里的static1 就是 settings.py 中配置的 STATIFC_URL 的值,由此可以看出,web页面渲染出来的 是 这个引用指针,而不是实际的路径,其实际的路径指向 STATICFILES_DIRS 中的路径,
以下 两个图引用自其他地方 详情见: https://www.jb51.net/article/107884.htm
疑问??????
app目录下存放我们的 模板文件templates 和 静态文件 static_files 如何设置呢: 设置方法可能是 下边的,
‘DIRS’: [],
STATICFILES_DIRS = []
4.2.3 html 文件引用静态文件语法
4.2.4 启动django项目
pycharm 项目右上角 绿色 三角启动即可,启动之后变为红色方块,下方可以看到 web项目的 访问路径
命令行方式启动:
python manage.py runserver ip:端口号
eg: python manage.py runserver 127.0.0.1:8000
4.3 返回数据给前端页面
https://www.jb51.net/article/107884.htm
一般都是 用户在web页面做某些操作如 查询,我们需要将数据库中的数据返回到页面上,
以我们访问 http://127.0.0.1:8000/temp_learn/ 为例子,返回给用户 web页面,并把数据渲染到页面上
用到的文件有:
- urls.py: urlpatterns 中增加 path(‘temp_learn/’, views.temp_learn)
- views.py: 增加def temp_learn()方法, 当用户访问url 的时候,这个方法 返回 html 页面 和 需要显示在页面上的数据
- temp_learn.html: html 页面 views.py 的 def temp_learn()方法中 把temp_learn.html 页面返回给用户。
这里重点讲 view.py怎么把数据返回给 temp_learn.html文件
几个文件内容增加的代码如下:
# urls.py 文件:urlpatterns 中增加 path('temp_learn/', views.temp_learn)
urlpatterns = [
path('admin/', admin.site.urls),
path('temp_learn/', views.temp_learn)
]
4.3.1 views.py render()返回html 和 数据
# views.py 文件 增加 def temp_learn()方法
def temp_learn(request):
n1 = '数学'
cl = ['lili', 'liming']
c_info = {
'name': 'xiaoli',
'age': '15',
'math': '90'
}
return render(request, "temp_learn.html", {'course': n1, 'classmate': cl, 'info': c_info})
render() 中三个参数:render(request, “temp_learn.html”, {‘course’: n1, ‘classmate’: cl, ‘info’: c_info})
参数1:request 是固定的,就是用户的请求,
参数2:“temp_learn.html”: 用户发送url 请求,返回给的用户承载数据的 html 页面
参数3:字典类型,就是需要渲染到页面上的数据 如:{‘course’: n1, ‘classmate’: cl, ‘info’: c_info}
4.3.2 html页面渲染render()返回的数据
字符串 列表 字典 如何调用,if 语句 for 语句如何书写。如下:
{{ }} 双括号 中填写变量,变量就是 render()参数三 返回的字典,用到字典中的哪个值,通过字典的key 调用即可
{‘course’: n1, ‘classmate’: cl, ‘info’: c_info} 根据4.3.1 中可知道, course 的值 是字符串类型, classmate 是 列表类型的, info 是 字典类型的
-
字符串类型调用: {{ course }}
-
列表调用:{{ classmate }}
-
通过索引调用列表中的某个值: {{ classmate.0 }} .0表示 列表中的第一个值
-
字典调用:{{ info }}
-
通过.key调用字典中的某个值:{{ info.age }}
-
if 语句
{% if 条件1 %}
html 标签
{% elif 条件2 %}
html 标签
{% else %}
html 标签
{% endif %} -
for 语句
{% for x in xxx %}
html 标签
{% endfor %}
// temp_learn.html 内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板语法学习</title>
</head>
<body>
<div>
<div>变量语法:字符串类型 课程 = {{ course }}</div>
<div>列表类型:列表所有的值 :{{ classmate }}</div>
<div>列表类型:列表索引调用: {{ classmate.0 }} , {{ classmate.1 }}</div>
<div>字典类型: 字典的所有值: {{ info }}</div>
<div>字典类型: 字典中的某个值:年龄: {{ info.age }}</div>
<div>对列表 for 循环:
{% for class in classmate%}
<ul>同学名字: {{ class }}</ul>
{% endfor %}
</div>
<div>对字典 for 循环:
{% for key in info.keys %}
<ul>字典中所有key值,info.keys循环: {{ class }}</ul>
{% endfor %}
{% for value in info.values %}
<ul>字典中所有value值,info.values 循环: {{ class }}</ul>
{% endfor %}
{% for k,v in info.items %}
<ul>key, value同时循环 info.items 循环 : {{ class }}</ul>
{% endfor %}
</div>
<div>if 语句:
{% if info.math > 90 %}
<span>数学成绩大于90</span>
{% elif info.math == 90 %}
<span>数学成绩等于90</span>
{% else %}
<span>数学成绩小于90</span>
{% endif %}
</div>
</div>
</body>
</html>
web 页面渲染结果如下:
4.3.4 request & response
-
request:
request.method:获取用户请求提交方式(GET/POST)
request.GET:获取通过URL传递的参数
request.POST:通过请求体中获得数据
-
response:
HttpResponse():返回内容字符串给请求者;
render():读取HTML,并渲染,最终以字符串的格式返回给用户浏览器;
redirect():让浏览器重定向到其他页面,返回的是网址。
浏览器提交请求给Django,Django收到请求并直接返回给浏览器重定向的网址,浏览器重新去新的网址那里提交请求,然后新的网址给浏览器返回响应数据。
4.3.5 数据库 ORM 操作
ORM 简介:
一般我们操作数据库 是通过写 比如pymysql 代码–》sql 语句来实现的,select * from db
django 的 ORM 是 封装了sql 语句,不需要我们自己写sql 语句了,通过操作 models.py 文件,写models相关的语法语句,(django 把models相关的语句 转换成 sql 语句再去操作数据库)从而实现操作数据库。
原理示意图 如下: 图片来自于 https://blog.csdn.net/Ans_min/article/details/123146335
ORM可以帮助我们做两件事:
1 增删改查数据库中的表(不用写SQL语句)【但数据库你得自己建】
2 操作表中数据,即增删改查表中记录(不用写SQL语句)
settings.py 数据库配置,
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
tasks/models.py 写作
给 tasks 这个 app创建表 通过models.py 文件中创建一个类来实现,类中写数据表中包含的字段。django 会根据这个类转换成数据表,最后创建的数据表名字是 app名字_类名
from django.db import models
# Create your models here.
class UserInfo(models.Model): # 这里继承是固定写法,类名自定义,
# 创建两个表字段 username password, 都是 char 类型,长度分别是 32 64
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
执行命令,生成数据库表
python manage.py makemigrations
python manage.py migrate
执行上边两个命令,django 就会解析 models.py 执行数据库操作
pycharm 查看 数据库
File 这里选择django 项目的 db.sqlite3数据库,测试连接成功。
Schemas 这里选择 All schemas
非常重要,否则看不到数据表
查看表: tasks_userinfo(表名是app名称_类名)
生成表的原理是django去所有app的models.py中找需要创建的表,在settings.py中可以看到,有很多django默认自带的app(如下图),所以除了tasks_userinfo表,其他表都是django自带生成的表,我们暂先不用管。
如果还想新建表,就再在models.py里写类,然后执行那两个指令即可。
4.4 练习
文本框中输入用户名和密码,提交后返回用户信息页面,把用户名密码展示到页面上。
如上,我们用到两个页面,
add_user.html : 用户名 密码输入页面,
user_info.html:login提交之后 返回的页面
# add_user.html 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>user add page</title>
</head>
<body>
<form action="/user_info/" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="提交">
</form>
</body>
</html>
# user_info.html 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>users info page</title>
</head>
<body>
<div>
<table border="1">
<thead>
<th>用户名</th>
<th>密码</th>
</thead>
<tbody>
<tr>
<td>{{ username }}</td>
<td>{{ password }}</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
urls.py 文件: 增加 add_user user_info 路由;
# urls.py 文件
urlpatterns = [
path('admin/', admin.site.urls),
path('add_user/', views.add_user),
path('user_info/', views.user_info),
]
views.py 文件:增加两个方法
# views.py 文件
def add_user(request):
return render(request, "add_user.html")
def user_info(request):
user = request.POST.get("username")
pwd = request.POST.get("password")
return render(request, "user_info.html", {"username":user, "password": pwd})
输入用户名 密码 提交
提交后返回这个页面:
因为django有一个跨站请求保护机制,我们在settings文件中将它关闭。如图,注释掉即可。
提交之后返回 user_info.html 页面并且把刚刚输入的信息展示出来