Django-基本入门
Django简介
- 是一个开放源代码的Web应用框架,由 Python写成
- 初次发布于2005年7月,并于2008年9月发布了第一个正式版本1.0
-
MVC
-
概述
- 一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
-
核心思想
- 解耦
-
图解
-
编程模式
-
Model(模型)
- 是应用程序中用于处理应用程序数据逻辑的部分
- 通常模型对象负责在数据库中存取数据
-
View(视图)
- 是应用程序中处理数据显示的部分
- 通常视图是依据模型数据创建的
-
Controller(控制器)
- 是应用程序中处理用户交互的部分
- 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
-
-
优点
- 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
-
-
MTV
-
概述
- 本质上与MVC模式没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同
-
核心思想
- 解耦
-
图解
-
编程模式
-
Model(模型)
- 负责业务对象与数据库的对象(ORM)
-
Template(模板)
- 负责如何把页面展示给用户
-
View(视图)
- 负责业务逻辑,并在适当的时候调用Model和 Template
-
-
注意
- Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和 Template
-
Django安装
-
Django与 Python版本对应关系
Django version Python versions 1.8 2.7,3.2(until the end of 2016),3.3,3.4,3.5 1.9,1.10 2.7,3.4,3.5 1.11 2.7,3.4,3.5,3.6 2.0 3.4,3.5,3.6 2.1 3.5,3.6,3.7 -
安装过程
- 进入黑屏终端
- 输入
pip install Django==1.11.4
- 验证是否安装成功
- 进入python环境
1
2
3>>> import django
>>> django.get_version()
'1.11.4'
- 进入python环境
Django项目创建
-
打开黑屏终端,进入工程存放目录
1
django-admin startproject project
-
目录层级
- manage.py文件
- 一个命令行工具,可以使我们使用多种方式对Django项目进行交互
- project目录
__init__.py
:一个空文件,它告诉Python这个目录应该被看做一个Python包settings.py
:项目的配置文件urls.py
:项目的URL声明wsgi.py
:项目与WSGI兼容的Web服务入口
- manage.py文件
基本操作
-
设置表结构
-
数据库配置
- 注意:Django默认使用的是SQLite数据库
- 通过
settings.py
文件中的DATABASES
选项进行配置 - 在
__init__.py
文件中添加以下代码1
2
3import pymysql
pymysql.install_as_MySQLdb() - 将
DATABASES
做如下修改1
2
3
4
5
6
7
8
9
10DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名',
'USER': '用户名',
'PASSWORD': '密码',
'HOST': 'IP',
'PORT': '端口'
}
}
-
创建应用
- 在一个工程中可以创建一个或者多个应用,每个应用对应处理一类业务逻辑
- 黑屏终端进入工程目录下
1
python manage.py startapp myApp
-
激活应用
-
配置
settings.py
中的INSTALL_APPS
1
2
3
4
5
6
7
8
9INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myApp',
]
-
-
定义模型
-
概述
- 有一个数据表,就对应有一个模型类
-
在应用目录下的
models.py
文件中定义模型1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20from django.db import models
# Create your models here.
# 定义模型
class Grade(models.Model):
name = models.CharField(max_length=20)
boyNum = models.IntegerField()
girlNum = models.IntegerField()
isDelete = models.BooleanField(default=False)
class Student(models.Model):
name = models.CharField(max_length=20)
sex = models.BooleanField()
content = models.CharField(max_length=20)
age = models.IntegerField()
grade = models.ForeignKey("Grade")
isDelete = models.BooleanField(default=False) -
说明
- 不需要定义主键,在生成时自动添加,并且值为自动增长
-
-
生成数据表
-
生成迁移文件
1
python manage.py makemigrations
在应用目录下的
migrations
目录下生成一个迁移文件 -
执行迁移
1
python manage.py migrate
在数据库中生成对应的表
-
-
数据测试
-
进入
python shell
模式1
python manage.py shell
-
引入包
1
from myApp.models import Student,Grade
-
增
1
2
3
4
5
6
7
8
9
10
11
12
13from myApp.models import Student,Grade
grade = Grade()
"zzpython1801" grade.name =
40 grade.boyNum =
10 grade.girlNum =
grade.save()
sut = Student()
"sunck" sut.name =
True sut.sex =
"sunck is a good man" sut.contend =
18 sut.age =
sut.grade = grade
sut.save() -
删
1
stu2.delete()
仅仅删除数据库中对应数据,程序中的对象依然可以使用
-
恢复数据
1
stu2.save()
-
-
改
1
2
31) stu = Student.objects.get(pk=
19 stu.age =
stu.save() -
查
-
获取所有数据
1
stus = Student.objects.all()
-
获取一个数据
1
Grade.objects.get(pk=1)
-
-
-
启动服务
-
格式
1
python manage.py runserver ip:port
1.
ip
可以不写python manage.py runserver port
2.端口号默认为8000,可以修改python manage.py runserver 8080
-
说明
- 这是一个纯python编写的轻量级web服务器,仅在开发阶段中使用,稳定性低。
- 如果修改了文件不需要手动启动服务,会自动重启。如果删除文件需要手动重启服务。
-
-
视图的基本使用
-
概述
- 视图是对WEB请求进行的响应。
- 视图接收
request
对象作为第一个参数,包含了请求的信息,是由Django
服务构建而成的。 - 视图的本质就是一个函数,被定义在
views.py
文件中。
-
定义视图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20from django.shortcuts import render
from django.http import HttpResponse
from myApp.models import Student, Grade
# Create your views here.
def index(request):
return HttpResponse('<H1>Hello Django</H1>')
def students(request):
stus = Student.objects.all()
print(stus)
return HttpResponse("所有学生信息")
def grades(request):
gs = Grade.objects.all()
print(gs)
return HttpResponse("所有班级信息") -
路由配置
-
主路由:
-
关联子路由
1
2
3
4
5
6
7from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('myApp.urls')),
-
-
子路由
-
在应用目录下创建名为
urls.py
的文件作为子路由文件1
2
3
4
5
6
7
8
9# -*- coding:utf-8 -*-
from django.conf.urls import url
from myApp import views
urlpatterns = [
url(r'^$', views.index),
url(r'^students/$', views.students),
url(r'^grades/$', views.grades),
]
-
-
-
-
模板的基本使用
-
概述
- 模板是HTML页面,可以根据视图中传递的数据进行填充(渲染)
-
创建模板存放目录
- 工程目录下创建名为templates的目录
- 在templates目录下创建对应应用目录
-
配置模板路径
1
2
3
4TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")], -
定义模板
-
index.html
1
2
3
4
5
6
7
8
9
10
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html> -
students.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生信息</title>
</head>
<body>
<h1>学生信息</h1>
<ul>
{% for stu in stus %}
<li>{{ stu.name }}--{{ stu.age }}--{{ stu.grade }}</li>
{% endfor %}
</ul>
</body>
</html> -
grades.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html lang="en">
<head>
<meta charset="UTF-8">
<title>班级信息</title>
</head>
<body>
<h1>班级信息</h1>
<ul>
{% for grade in grades %}
<li>{{ grade.name }}</li>
{% endfor %}
</ul>
</body>
</html>
-
-
在
views.py
中使用模板文件-
基本使用
1
2
3def index(request):
# return HttpResponse('<H1>Hello Django</H1>')
return render(request, 'myApp/index.html') -
给模板传递数据并渲染后返回页面
1
2
3
4
5def students(request):
stus = Student.objects.all()
print(stus)
# return HttpResponse("所有学生信息")
return render(request, 'myApp/students.html', {"stus": stus})1
2
3
4
5def grades(request):
gs = Grade.objects.all()
print(gs)
# return HttpResponse("所有班级信息")
return render(request, 'myApp/grades.html', {"grades": gs})
-
-
扩展
-
点击班级展示对应班级的学生
-
模板
grades.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html lang="en">
<head>
<meta charset="UTF-8">
<title>班级信息</title>
</head>
<body>
<ul>
{% for grade in grades %}
<li><a href="/students/{{ grade.id }}/">{{ grade.name }}</a></li>
{% endfor %}
</ul>
</body>
</html> -
路由
1
url(r'^students/(\d+)/$', views.gradeStudents),
-
视图
1
2
3def gradeStudents(request, gid):
stus = Student.objects.filter(grade_id=gid)
return render(request, 'myApp/students.html', {"stus": stus})
-
-
-
修改模型
- 期间修改模型,一般直接生成迁移文件再迁移即可。如果出现无法生成迁移文件或者无法迁移时:
- 第一种方案,删除数据,重新创建,删除所有的迁移文件重新操作。
- 第二种方案,删除有问题的迁移文件,修改迁移记录,再重新操作。