MVC架构
1. MVC
M: model 模型 对数据库进行操作
V:view 视图 给用户提供页面
C:controller 控制器 负责调度 传递指令
Django MTV架构
2. MTV:
M: model 模型 ORM 对数据库进行操作
T:template 模板 对HTML文件进行渲染
V: view 视图 函数 负责业务逻辑
Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。
Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
创建Django 项目
1. 下载:
命令行:
pip install django==1.11.15
pip install -i 源 django==1.11.15
pycharm
settings 解释器 点+号 输入django 选择版本
2. 创建django项目
1. 命令行
cd 保存项目的目录
django-admin startproject 项目名
2. pycharm
file ——》 new project ——> 选择django ——> 选择解释器 ——》 创建django项目
3. 启动项目
1. 命令行:
cd manage.py 的目录下
python manage.py runserver # 127.0.0.1:8000 默认ip和端口号
python manage.py runserver 80 # 127.0.0.1:80 自己设置端口号为80
python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80 自己设置ip为0.0.0.0 端口号为80
2. pycharm
配置项
点绿色三角启动
4. settings配置
1. 静态文件
STATIC_URL = '/static/' # 别名
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
]
2. TEMPLATES 模板 HTML文件
DIRS [os.path.join(BASE_DIR, 'templates')]
3. 注释csrf中间件(为了表单提交)
4. 数据库的配置
5. URL和函数的对应关系 ——> urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index),
url(r'^test/', views.test)
]
6. APP
1. 创建APP
1. 命令行
python manage.py startapp app01
2. pycharm
tools ——> run manage.py task ——> startapp app01
2. 注册APP
在settings.py中的INSTALLED_APPS写:
‘app01’ 或者 'app01.apps.App01Config'
7. 使用MySQL数据库
1. 创建一个MySQL数据库
2. settings的配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 引擎
'NAME': 'day66', # 数据库名
'USER':'root', # 用户名
'PASSWORD':'', # 密码
'HOST':'127.0.0.1', # IP
'PORT': 3306, # 端口号
}
}
3. 告诉django使用pymysql模块连接数据库
在settings.py同级目录下的__init__.py中写:
import pymysql
pymysql.install_as_MySQLdb()
4. 建表 在app01/models.py中写类(继承models.Model)
class Userinfo(models.Model):
user = models.CharField(max_length=32) # varchar(32)
pwd = models.CharField(max_length=32)
5. 执行数据库迁移命令
python manage.py makemigrations # 记录models.py中类是不是有变化 将变化的内容记录下来
python manage.py migrate # 将model的变更同步到数据库中
8. ORM
对象和关系型数据库的映射 通过操作对象的方式来操作数据库
映射关系;
类 —— 》 数据表
对象 —— 》 数据行
属性 —— 》 字段
ORM能做的事:
操作数据表
操作数据行
ORM操作:
from login import models
# 获取所有数据
models.Userinfo.objects.all() ——》 Queryset
# 获取一条数据
models.Userinfo.objects.get(user='alex',pwd='alexdsb')
取不到数据或者取到多条数据的时候报错
# 创建一条数据
models.Userinfo.objects.create(user='alex',pwd='alexdsb')
1. 查
from app01 import models
models.Publisher.objects.get(id=1,name='xx') # 获取一个对象 —— 》一个对象
models.Publisher.objects.all() # 获取所有对象 ——》 queryset 对象列表
models.Publisher.objects.filter(id=1,name='xx') # 获取满足筛选条件的所有对象 ——》 queryset
models.Publisher.objects.all().order_by('-id')
属性:
pub_obj.id
pub_obj.name
外键:
book_obj.id
book_obj.title
book_obj.publisher ——》 书籍关联的出版社对象
book_obj.publisher_id ——》 书籍关联的出版社对象的id
多对多:
autho_obj.id
autho_obj.name
autho_obj.books ——》管理对象
autho_obj.books.all()
2. 增
pub_obj = models.Publisher.objects.create(name='新的出版社名字')
外键:
models.Book.objects.create(title='新的书名',publisher=pub_obj)
models.Book.objects.create(title='新的书名',publisher_id=pub_obj.id)
多对多:
autho_obj = models.Author.objects.create(name='作者名字')
autho_obj.books.set([1,3,5])
3.删
models.Publisher.objects.get(id=1,name='xx').delete()
models.Publisher.objects.all().delete()
4. 改
pub_obj.name = '新的名字'
pub_obj.save()
book_obj.title = '新的书名'
book_obj.publisher = pub_obj
# book_obj.publisher_id = 1
book_obj.save()
autho_obj.name = '新的名字'
autho_obj.save()
autho_obj.books.set([1,2,3])
一对多
# obj = models.Book.objects.get(id=3)#id为3的图书表的对象
# print(obj.title,type(obj.title))#盘龙
# print(obj.publisher)#app01.models.Publisher 盘龙这本书相对应的出版社的对象
# print(obj.publisher.id)#4 盘龙这本书相对应的出版社的id
# print(obj.publisher.name)#农垦出版社
# print(obj.publisher_id)#4
多对多
# author_obj = models.Author.objects.get(id=2)
# print('我是打印1:',author_obj,type(author_obj))#id为2的作者对象app01.
# print('我是打印2:',author_obj.name,type(author_obj.name))#小明
# print('我是打印3:',author_obj.books,type(author_obj.books))#app01.models.Book.None 管理对象
# print('我是打印4:',author_obj.books.all()[0],type(author_obj.books.all()[0]))#图书列表对象
# print('我是打印5:',author_obj.books.get(),type(author_obj.books.get()))#app01.models.Book id为2的作者对应图书表的对象
# #author_obj.books.all()[0]与author_obj.books.get()相等,皆为app01.models.Book
# print('我是打印6:',author_obj.books.get().id,type(author_obj.books.get().id))#4
# print('我是打印7:',author_obj.books.get().title,type(author_obj.books.get().title))#诛仙
# print('我是打印8:',author_obj.books.get().publisher.name,type(author_obj.books.get().publisher).name)
# # 人民出版社 存到内存地址中
# print('我是打印9:',author_obj.books.get().publisher.id,type(author_obj.books.get().publisher).id)
9. form表单
1. method='post' action='' 请求方式 提交数据的地址
2. 所有的input的标签要有name属性
3. 有一个input的type=‘submit’ 或者有一个button按钮
10. GET 和 POST
1.GET
在浏览器地址栏上输入URL 回车
点击a标签
form表单不写method
127.0.0.1:8000/add_publisher/?id=1&name=alex
2.POST
form表达指定method='post'
数据不可见
11. views.py 写函数
request 跟请求相关的所有内容
request.method 字符串 请示方式 GET/POST
request.POST POST请求提交的数据 字典
request.GET GET请求提交的数据
返回值
from django.shortcuts import HttpResponse,render,redirect
HttpResponse('字符串') ——》 页面显示的就是'字符串'
render(request,'模板文件名') ——》 渲染你的HTML文件返回给浏览器
redirect('要跳转的URL') ——》 重定向 告诉浏览器再向URL再发一次GET请求
12. request ——》 封装请求的所有内容
request.method ——》 请求的方式 GET POST
request.POST ——》 post请求提交的数据 字典 request.POST['id'] request.POST.get('id',)
request.GET ——》 URL的参数
127.0.0.1:80/del_book/?id=1&name=xxx