文章目录
MTV模式:
Model 模型,与数据库交互
Template 模板,HTML
Views 视图,用于处理请求,返回响应
一、安装Django1.11.8
pip install django==1.11.8
二、创建Django项目
(一)使用cmd创建
进入Django项目目录下(或自定义任何目录)
django-admin startproject 项目名
(二)使用pycharm创建Django项目
file
- New Project
选择 Django
,并选择存放地址和项目名
三、运行Django
(一)使用cmd运行
进入DjangoDemo目录下
python manage.py runserver 127.0.0.1:8000 # 地址和端口
进入http://127.0.0.1:8000/
,如下显示为正常运行
(二)使用pycharm运行
右上角存在一个和项目名同名的按钮,点击运行
也可以点击编辑,进行修改
可以修改地址和端口号等
运行结果如图
点击网址,如图为正常运行
四、Django目录结构
以PycharmDjangoDemo为例,注意使用cmd创建项目没有template文件夹,可自行创建
1.manage.py
2.主文件夹(与项目名称一致的文件夹)
查看settings.py
文件
-
BASE_DIR 表示当前项目的绝对路径
-
DEBUG 是否启用调试模式,开发True,生产False
-
ALLOWED_HOSTS 设置允许访问到本项目的地址列表
取值:
** 空 表示只有localhost和127.0.0.1能访问
** [’*’] 表示任何本机的地址都能访问到当前项目,如localhost / 127.0.01 / 0.0.0.0 等,局域网也允许访问
注意:如果要在局域网内访问,启动方式为:python manage.py runserver 0.0.0.0:8000 # 端口号可以自己设置
-
INSTALLED_APPS 指定已安装的应用
-
MIDDLEWARE 注册中间件
-
TEMPLATES 指定模板的配置信息
-
DATABASES 指定数据库的配置信息
-
LANGUAGE_CODE 指定语言配置
取值:中文:zh-hans -
TIME_ZONE 时区
取值:中国时区:Asia/Shanghai
五、URL的使用
(一)urls.py
默认粗壮乃与主文件夹,主路由配置文件
包含最基本的路由 - 视图 的映射关系
(二)url()语法
from django.conf.urls import url
语法:
url(regex, view, kwargs=None, name=None)
- regex:字符串类型,匹配的请求路径,允许是正则表达式
- view:指定路径所对应的视图处理函数的名称
- kwargs:向视图中传递的参数
- name:为地址起别名,反向解析时使用
(三)简单url响应示例
在localhost:8000
中显示:Hello World
1.在主文件夹下创建 views.py
文件
2.在views.py
中
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
3.在urls.py
中
from django.conf.urls import url
from django.contrib import admin
from PycharmDjangoDemo import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.index) # ^$表示地址127.0.0.1:8000/ 后没有任何东西
]
4.运行
5.进入网页
(四)带参数url
使用正则表达式的子组进行传参:()
一个子组表示一个参数,多个参数需要使用多个子组,并使用 /
隔开
(五)带参数url示例
1.在主文件夹的views.py
中
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
def show(request, arg1, arg2):
# arg1, arg2为字符串,使用 ‘+’ 进行连接
return HttpResponse('参数1:' + arg1 + '参数2:' + arg2)
2.urls.py
中
from django.conf.urls import url
from django.contrib import admin
from PycharmDjangoDemo import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.index),
url(r'^show/(\d\d)/(\d)', views.show) # \d\d:两个数字,/:分隔 \d:一个数字
]
3.运行
4.进入 127.0.0.1:8000/show/99/5
99 两个数字,可任意
5 一个数字,可任意
(六)url()的name参数
请看完《七、Django中的模板:Templates》再继续往下看
name
参数作用:通过别名实现地址的反向解析,通常和模板搭配使用(模板的详细内容见七)
在模板中格式:
{% url '别名' %}
{% url '别名' '参数值1' '参数值2' %}
1.示例:不带参
1.在templates
中修改index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index首页</title>
</head>
<body>
<h2>这是index首页</h2>
<a href={% url 'long_url' %}>long_url首页链接</a>
</body>
</html>
2.修改idnex
的views.py
def index(request):
return render(request, 'index.html')
def long_url(request):
return HttpResponse('long_url首页')
3.修改idnex
的urls.py
4…运行127.0.0.1:8000
5.点击链接
2.示例:带参
1.在templates
中修改index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index首页</title>
</head>
<body>
<h2>这是index首页</h2>
<a href={% url 'long_url' '1' '2' '3' %}>long_url首页链接</a>
</body>
</html>
2.修改idnex
的urls.py
from django.conf.urls import url
from index import views
urlpatterns = [
url(r'^$', views.index),
url(r'^show_image/$', views.show_image),
url(r'^parent/$', views.show_parent),
url(r'^children/$', views.show_children),
url(r'^longlonglonglonglongurl/(\d)/(\d)/(\d)',views.long_url, name='long_url'),
]
3.修改idnex
的views.py
def long_url(request, arg1, arg2, arg3):
return HttpResponse('long_url首页' + '参数1:' + arg1 + '=参数2:'+ arg2 + '=参数3:'+ arg3)
4.运行127.0.0.1:8000,可见参数已被传入
六、应用-app
app是一个独立的业务模块
(一)创建 & 配置应用
1.使用cmd创建应用
python manage.py startapp 应用名
在项目下将会自动创建app文件夹
2.使用pycharm创建应用
1.Tools
2.创建应用
3.查看是否创建app文件
3.配置
在settings.py
中进行注册
INSTALLED_APPS = [
… …
‘创建的应用名’
]
(二)分布式路由系统
一般主文件夹(与项目同名的文件夹)中的urls用于分发url,而不用于直接处理请求
一般在应用中的urls.py
中处理url,在应用的views.py
中进行处理
应用中默认没有urls.py
文件,需要自己手动创建
示例
目标:
输入127.0.0.1:8000/ 页面显示 首页
输入127.0.0.1:8000/app/ 页面显示 app首页
输入127.0.0.1:8000/book/ 页面显示 book首页
1.创建两个新应用 book index(主界面)
startapp book
startapp index
2.在主文件夹下的setting.py
中配置应用,并删除主文件夹下的views.py
3.在app、index、book文件夹下创建urls.py
文件
4.进入主文件夹下的urls.py
,设置分发
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('index.urls')),
url(r'^app', include('app.urls')),
url(r'book', include('book.urls'))
]
5.进入index
文件夹下的views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('首页')
6.进入index
文件夹下的urls.py
from django.conf.urls import url
from index import views
urlpatterns = [
url(r'^$', views.index),
]
7.进入book
文件夹下的views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('book首页')
8.进入index
文件夹下的urls.py
from django.conf.urls import url
from book import views
urlpatterns = [
url(r'^$', views.index),
]
9.进入app
文件夹下的views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('app首页')
10.进入index
文件夹下的urls.py
from django.conf.urls import url
from app import views
urlpatterns = [
url(r'^$', views.index),
]
11.运行
http://127.0.0.1:8000/
http://127.0.0.1:8000/app
http://127.0.0.1:8000/book
七、Django中的模板:Templates
(一)Django中的模板
Django中的模板是由Django自己提供的,而非Jinja2
所以Django中的模板语法与Flask中的模板语法会稍有不同
(二)模板的配置
在主文件夹的setting.py
文件中有TEMPLATES
变量
- BACKEND : 指定模板的引擎
- DIRS : 指定保存模板的目录
- APP_DIRS : 是否要在应用中搜索模板本
- OPTIONS : 有关模板的选项们
(三)模板加载的的方式
1.通过 loader 获取模板,通过HttpResponse进行响应
示例
创建一个index.html
,进入网站127.0.0.1:8000时显示该html
1.在templates
创建index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index首页</title>
</head>
<body>
<h2>这是index首页</h2>
</body>
</html>
2.进入index
文件夹下的views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
# Create your views here.
def index(request):
# 1.通过loader加载模板
t = loader.get_template("index.html")
# 2.将t转换成字符串
html = t.render()
# 3.响应
return HttpResponse(html)
3.运行
2.使用 render() 直接加载并响应模板(推荐)
1.同上
2.进入index
文件夹下的views.py
from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, 'index.html')
3.运行显示同上
(四)模板的语法
1.变量
传入字典时,使用字典.键
获取值
(1)在模板中使用变量
{{ 变量名 }}
1.修改index.html
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index首页</title>
</head>
<body>
<h2>这是index首页</h2>
<h5>dic: {{ dic }}</h5>
</body>
</html>
(2)在后端中传递变量
进入index
文件夹下的views.py
from django.shortcuts import render
# Create your views here.
def index(request):
dic = {'one':1,'two':2}
return render(request, 'index.html', locals()) # 传递当前所有变量
3.运行
2.标签
作用:将一些服务器端的功能嵌入到模板中
标签语法:
{% 标签 %}
{% 结束标签 %}
(1)if 标签
语法:
{% if 条件 %}
{% endif %}
1.修改index.html
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index首页</title>
</head>
<body>
<h2>这是index首页</h2>
{% if dic.one == '1' %}
<h2>dic['one'] = '{{ dic.one }}'</h2>
{% endif %}
</body>
</html>
2.运行
(2)for 标签
语法:
{% for 变量 in 可迭代对象 %}
{% endfor %}
1.修改index.html
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index首页</title>
</head>
<body>
<h2>这是index首页</h2>
{% for i in dic %}
<h2>{{ i }}</h2>
{% endfor %}
</body>
</html>
2.运行
3.内置变量:forloop
1.forloop.counter : 得到当前循环遍历的次数,从1开始
2.forloop.counter0 : 得到当前循环遍历的下标,从0开始
3.forloop.first 返回真假
4.forloop.last 返回真假
修改index.html
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index首页</title>
</head>
<body>
<h2>这是index首页</h2>
{% for i in dic %}
<h2>{{ i }}</h2>
forloop.counter: {{ forloop.counter }}
forloop.counter0: {{ forloop.counter0 }}
forloop.first: {{ forloop.first }}
forloop.last: {{ forloop.last }}
{% endfor %}
</body>
</html>
运行
(五)模板的静态文件
什么是静态文件:不能与服务器端做动态交互的文件都是静态文件,如:图片,css,js,音频,视频,html文件(部分)
1.静态文件的配置
- 默认情况下,项目中不存在 static 文件夹,需要自己创建
- 在主文件夹下的
settings.py
中配置一下两项内容:
注意:如果不加上此配置语句,很可能会出现无法访问静态文件的情况,在项目中最好加上# 配置静态文件的访问路径 STATIC_URL = '/static/' # 配置静态文件的存储路径 STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),)
2.静态文件的访问
(1)使用静态文件的访问路径进行访问
示例:
- 保存一张图片,将其放到
static
文件夹中
2. 在templates
中新建show_image.html
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>show_image</title>
</head>
<body>
<img src="/static/1.png">
</body>
</html>
3. 修改index
文件夹下的views.py
文件
def show_image(request):
return render(request, 'show_image.html')
4. 修改index
文件夹下的urls.py
文件
from django.conf.urls import url
from index import views
urlpatterns = [
url(r'^$', views.index),
url(r'^show_image/$', views.show_image)
]
5.运行127.0.0.1:8000/show_image
成功显示图片
(二)通过 {% static %}标签访问静态文件
{% static %}表示的就是静态文件访问路径
1.加载 static
{% load static %}
2.使用静态资源时
语法:{% static ‘静态资源路径’ %}
示例:
修改show_image.html
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>show_image</title>
</head>
<body>
{% load static %}
<img src={% static '1.png' %}>
</body>
</html>
运行127.0.0.1:8000/show_image,显示图片
(六)模板的继承
1.在父模板中
要标识出哪些在子模板中是允许被修改的
格式:
{% block 块名 %}
...
{% endblock %}
block 作用:
- 在父模板中正常显示
- 在子模板中
不重写,将按照父模板的效果显示
重写,则按照重写效果显示
2.在子模板中
- 指定要继承自哪个父模板
格式:{% extends '父模板名称' %}
- 重写父模板中的内容
格式:{% block 块名 %} ... {% endblock %}
3.继承的注意事项
模板继承时,服务器端的动态内容无法继承
4.模板继承示例
1.在templates
中创建parent.html
和children.html
parent.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>parent</title>
</head>
<body>
<h5>parent首页</h5>
{% block show_name %}
<h5>我叫parent</h5>
{% endblock %}
</body>
</html>
children.html
{% extends 'parent.html' %}
{% block show_name %}
<h5>我叫children</h5>
{% endblock %}
2.修改index
文件夹下的views.py
文件
def show_parent(request):
return render(request, 'parent.html')
def show_children(request):
return render(request, 'children.html')
3.修改index
文件夹下的urls.py
文件
from django.conf.urls import url
from index import views
urlpatterns = [
url(r'^$', views.index),
url(r'^show_image/$', views.show_image),
url(r'^parent/$', views.show_parent),
url(r'^children/$', views.show_children),
]
4.分别运行127.0.0.1:8000/parent/ 和 127.0.0.1:8000/children/
parent.html
children.html
可见,children.html
继承了parent.html
,并修改了block
中的内容
八、Django中的模型 - Models
(一)ORM模型
ORM : Object Relationship Mapping
对象 关系 映射
三大特征:
- 表 到 类的映射
- 数据类型的映射
- 关系映射
Django中的Models与数据库的表是映射关系,
1.Models中的每一类相当于数据库中的每一张表
2. 类名 -> 表名
3.类属性 -> 字段
4 .每个类的实例 -> 表的每一行数据
数据库与Djando数据的导入导出过程
(二)Django与数据库
1.数据库的配置信息
主文件夹下的settings.py
文件中进行配置
```
DATABASES = {
'default':{
'ENGINE':'数据库引擎',
'NAME':'数据库名',
'USER':'用户名',
'PASSWORD':'密码',
'HOST':'主机',
'PORT':'端口',
}
}
```
1.ENGINE:指定数据库的引擎,mysql引擎为:‘django.db.backends.mysql’
2.NAME:指定要连接的数据库的名称
3.USER:指定登录到数据库的用户名
4.PASSWORD:指定登录到数据库的密码
5.HOST:指定要连接的主机
6.PORT:指定要连接的主机上的端口号
2.数据库迁移
(1)将Models类生成中间文件
在cmd中
python manage.py makemigrations 应用名
作用:将每个应用下的models.py文件生成一个中间文件,并保存在migrations文件夹中
(2)将中间文件映射回数据库
在cmd中
python manage.py migrate
作用:将每个应用下的migrations目录中的中间文件同步回数据库
3.将数据库导出到models
在cmd中
python manage.py inspectdb 表名
4.Django配置数据库示例(以MySql为例)
- 在数据库中创建新的数据库test
- 在主文件夹下的
settings.py
文件中进行配置即完成DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'root', 'PASSWORD': '123456', 'HOST': 'localhost', "POST": '3306' } }
(三)Models
在应用文件夹中,存在models.py
文件,用于编写模块
以项目中的index应用为例
1.Models的语法规范
语法:
class CLASSNAME(models.Model):
NAME=models.FIELD_TYPE(FIELD_OPTIONS)
- CLASSNAME:实体类名,表名组成一部分
默认表名组成规范:应用名称_classname - NAME:属性名,映射回数据库就是字段名
- FIELD_TYPE:字段类型:映射到表中的字段的类型
字符类型 | 数据库类型 | 描述 |
---|---|---|
BooleanField() | tinyint | 编程语言中:使用True或False来表示值,在数据库中:使用1或0来表示具体的值 |
CharField() | varchar | 必须要指定max_length参数值 |
DateField() | date | 表示日期,在编程语言中,使用字符串来表示具体值 |
DateTimeField() | datetime | 表示日期和时间 |
DecimalField() | datetime | 使用小数表示该列的值 |
FloatField() | float | 使用小数表示值 |
EmailField() | varchar | 编程语言和数据库中使用字符串 |
IntegerField() | int | 编程语言和数据库中使用整数 |
URLField() | varchar | 编程语言和数据库中使用字符串 |
ImageField() | varchar | 在数据库中为了保存图片的路径,编程语言和数据库中使用字符串 |
TextField() | text | 表示大量数据,编程语言和数据库中使用字符串 |
- FIELD_OPTIONS:字段选项,指定创建的列的额外的信息
字段选项 | 描述 |
---|---|
primary_key | 如果设置为True,表示该列为主键 |
null | 如果设置为True,表示该列值允许为空默认为False |
default | 设置所在列的默认值 |
db_index | 如果设置为True,表示为该列增加索引 |
unique | 如果设置为True,表示该列的值唯一 |
db_column | 指定列的名称,如果不指定的话则采用属性名作为列名 |