Django简介
Django是一个开放源代码的Web应用框架,由python写成,初次发布于2005年7月,并于2008年9月发布了第一个正式版本1.0
MVC:MVC是一种软件设计典范,核心思想是解耦
MVC优点:降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现了代码重用
Django与python版本对应关系
Django Version | Pyhton Version |
---|---|
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 |
MVC
Model(模型):是应用程序中用于处理程序逻辑的部分,负责数据库中存储数据
View(视图):是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的
Controller(控制器):是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
MVC图解
Django的MTV
本质与MVC模式没有区别,只是定义形式不同
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模板):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
MTV图解
创建工程
# 黑屏终端,进入指定目录 创建工程
django-admin startproject project
[图片上传失败...(image-e0e67a-1534428254655)]
数据库配置
setting.py
中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django', #数据库名字
'USER': 'root', #账号
'PASSWORD': '123456', #密码
'HOST': '127.0.0.1', #IP
'PORT': '3306', #端口
}
}
在__init__.py
文件中写入以下两行代码:
import pymsql
pymsql.install_as_Mysqldb()
或者安装pip install mysqlclient或者pip install mysql-python
安装出错可以到http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
下载对应版本安装。
创建应用
在一个工程中可以创建一个到多个应用,每个应用处理一种业务逻辑
打开黑屏终端进入工程目录下 python manage.py startapp myApp
目录结构:
├── db.sqlite3 # 数据库
├── myApp # 一个应用
│ ├── admin.py # 管理
│ ├── apps.py # 应用的配置
│ ├── __init__.py
│ ├── migrations # model到数据库映射的中间文件
│ │ └── __init__.py
│ ├── models.py # model
│ ├── tests.py # 在这里可以写测试代码
│ └── views.py # 视图
├── project # 创建项目时创建的目录
│ ├── __init__.py
│ ├── settings.py # 项目的配置文件
│ ├── urls.py # 根路由
│ └── wsgi.py
└── manage.py
# setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myApp',
]
启动服务
python manage.py runserver ip:port
ip可以不写 python manage.py runserver
端口默认8000,可以单独修改 python manage.py runserver port
定义模型
modeles.py
from 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)
def __str__(self):
return self.name
class Student(models.Model):
name = models.CharField(max_length=20)
sex = models.BooleanField()
age = models.IntegerField()
content = models.CharField(max_length=40)
# 关联类名的小写加引号或者直接类名
grade = models.ForeignKey('grade')
isDelete = models.BooleanField(default=False)
def __str__(self):
return self.name
说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长
生成数据表
生成迁移文件:python manage.py makemigrations [app名字]
作用: 在应用目录下的migrations目录下成迁移文件
执行迁移: python manage.py migrate [app名字]
作用:相当于执行sql语句生成数据表,表名为 应用名全小写_类名全小写
查看建表语句: python manage.py sqlmigrate app名字 0001
说明:0001为makemigrations之后产生了0001_initial.py文件
模型操作数据库
# 进入pyhton shell模式
python manage.py shell
# 引入包
from myApp.models import Grade,Student
# 增
>>> grade = Grade()
>>> grade.name = "python01"
>>> grade.boyNum = 50
>>> grade.girlNum = 10
>>> grade.save()
>>> stu = Student()
>>> stu.name = "sunck"
>>> stu.sex = "True"
>>> stu.age = 18
>>> stu.contend = "sunck is a good man"
>>> stu.grade = grade
>>> stu.save()
# 删
stu.delete()
# 改
>>> stu.age = 17
>>> stu.save()
# 查
stus = Student.objects.all()
grade = Grade.objects.get(pk=1)
视图的基本使用
概述:
在Django中视图对WEB请求进行响应的,视图的本质是python中的函数,在views.py文件中定义,
视图接收request对象作为第一个参数,包含了请求的信息
定义视图
view.py
from django.shortcuts import render
from django.http import HttpResponse
from myApp.models import Grade, Student
def index(request):
return HttpResponse("sunck is a good man")
def detail(request, num):
return HttpResponse("detail %s" % num)
HttpRequest对象的属性
path: 请求页面的全路径,不包括域名
method: 请求中使用的HTTP方法的字符串表示。全大写表示。例如
if request.method == "GET":
do_something()
elif request.method == "POST":
do_something_else()
GET: 包含所有HTTP GET参数的类字典对象
POST:包含所有HTTP POST参数的类字典对象
user:是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为 django.contrib.auth.models.AnonymousUser的实例(匿名用户)。你可以通过user的is_authenticated()方法来辨别 用户是否登陆:
if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware时该属性才可用
session:唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。
COOKIES: 包含所有cookies的标准Python字典对象;keys和values都是字符串。
FILES: 包含所有上传文件的类字典对象;FILES中的每一个Key都是 <input type = "file"name = ""/> 标签中
name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
filename: 上传文件名,用字符串表示
content_type: 上传文件的ContentType
content: 上传文件的原始内容
配置路由
主路由:与工程名相同名字的目录下的urls.py文件
配置文件:ROOT_URLCONF = 'project.urls'
urls.py
from 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的文件
作用:路由分发,规定哪个网址由哪个视图处理
urls.py
from django.conf.urls import url
from myApp import views
urlpatterns = [
# 路由匹配
url(r'index/', views.index),
url(r'detail/(\d+)/', views.detail),
]
模板的基本使用
概述:模板是HTML界面,可以根据视图传递的数据进行填充
创建模板目录:工程目录下创建名为templates的目录,也可以放在项目目录中
配置模板路径:
settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
'APP_DIRS': True,
}
定义模板
grade.html
<!DOCTYPE html>
<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>
student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生信息</title>
</head>
<body>
<h1>学生信息</h1>
<ul>
{% for stu in stusList %}
<li>{{ stu.name }}--{{ stu.grade }}--{{ stu.age }}</li>
{% endfor %}
</ul>
</body>
</html>
在视图中返回模板
views.py
from myApp.models import Grade, Student
def students(request):
#获取所有学生信息列表
stus = Student.objects.all()
return render(request, 'students.html', {"stusList":stus})
def grades(request):
grades = Grade.objects.all()
return render(request, 'grades.html', {'grades': grades})
def gstudents(request, gid):
stus = Student.objects.filter(grade_id=gid)
return render(request, "students.html", {"stusList":stus})
urls.py
url(r'students/grade/(\d+)/', views.gstudents),