一般的网站开发呢,会使用 MVC 框架,Django 在 MVC 框架的基础上创建了 MVT 框架。
MVC 框架运行流程:
MVT框架运行流程
环境准备,使用Pycharm可以跳过这一步
1. 安装虚拟环境
sudo pip install virtualenv
2. 安装虚拟环境拓展包
sudo pip install virtualenvwrapper
3. 编辑 ~/.bashrc 文件,在最后末尾追加
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
4. 使用 source.bashrc 生效
source ~/.bashrc
5. 创建一个Python3的虚拟环境
mkvirtualenv -p python3 虚拟环境名称
6. 进入刚刚创建的虚拟环境工作
workon 虚拟环境名称
7. 查看本机上有几个虚拟环境
workon + 空格 + 两个tab键
8. 退出当前虚拟环境
deactivate 虚拟环境名称
9. 删除一个虚拟环境
rmvirtualenv 虚拟环境名称
10. 虚拟环境安装包名/模块
pip install 包名
11. 查看安装了哪些包
pip list
pip freeze
创建一个基础项目
12. 安装Django环境
pip install django==1.8.2
13. 创建Django项目,必须在进入虚拟环境后创建
django-admin startproject 项目名
14. 创建一个Django应用
python manage.py startapp 应用名
15. 应用注册,修改 settings.py 中的 INSTALLED APPS 配置项,把刚刚注册的应用追加到末尾,格式:
' 刚刚创建的应用 '
16. 启动项目
python manage.py runserver
M模型部分
17. 用 Django 内嵌的 ORM 框架设计 模型类
18. 生成迁移文件,,首个迁移文件出现在 migrations 目录下,名称为 0001_initial.py
python manage.py makemigrations
19. 执行迁移生成表,生成表的默认命名: 应用名_模型类名小写
python manage.py migrate
20. 通过模型类操作数据表,进入 shell 命令:
python manage.py shell
21. 数据的操作详情:
# 从模型中导出设计好的类
from booktest.models import BookInfo,HeroInfo
1) 向 booktest_bookinfo 表中写入一条数据。(增删改查)
b = BookInfo() # 定义一个 BookInfo 类的对象
b.btitle ='天龙八部' # 定义b对象的属性并赋值
b.bpub_date = date(1990,10,11)
b.save() # 才会将数据保存进数据库
2) 查询出 booktest_bookinfo 表中id为1的数据。
b = BookInfo.objects.get(id=1)
3) 在上一步的基础上更改b对应图书的出版日期。
b.bpub_date = date(1989,10,21)
b.save() # 更新表格中的数据
4) 紧接上一步,删除b对应的图书的数据。
b.delete() # 删除表中id为1的数据
5) 向 booktest_heroInfo 表中插入一条数据。
h = HeroInfo() # 生成一个HeroInfo类对象
h.hname = '郭靖' # 给对象赋值
h.hgender = False
h.hcomment = ‘降龙十八掌’
b2 = BookInfo.objects.get(id=2) #生成一个id==2的对象存储BookInfo中id==2的书的全部信息
h.hbook = b2 #给关系属性赋值,英雄对象所属的图书对象(即:英雄属于哪本书)
h.save()
6) 查询图书表里面的所有内容。
BookInfo.objects.all()
查询英雄的所有数据(所有英雄)
HeroInfo.objects.all()
7) 查询出id为2的图书中所有英雄人物的信息。
b = BookInfo.objects.get(id=2)
b.heroinfo_set.all() #查询出b图书中所有英雄人物的信息
22. 修改时区和语言,修改 settings.py 文件中的
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
23. 创建管理员
python manage.py createsuperuser
24. 在应用的 admin.py 文件中注册模型类,告知 Django 框架根据注册的模型类生成对应的后台管理界面
1.导入要注册后台管理员界面的模板
from booktest.models import LOLcity
from booktest.models import LOLhero
2.注册模板
# Register your models here.
admin.site.register(LOLhero)
admin.site.register(LOLcity)
25. 运行:输入 http://127.0.0.1:8000/admin/ 进入管理员界面
26. 优化管理界面显示,在模板各函数中修改 __str__魔法方法,使其返回要返回的东西
def __str__(self):
# 返回书名
return self.cityname
27. 自定义后台管理显示,显示更多管理信息,并在注册信息中讲管理类赋值声明
# 自定义英雄联盟城市管理类
class LOLcityAdmin(admin.ModelAdmin):
list_display = ["id", "cityname", "citycreate"]
# 自定义英雄管理类
class LOLheroAdmin(admin.ModelAdmin):
list_display = ["id", "hname", "hgender", "hcomment", "hcity"]
# Register your models here.
admin.site.register(LOLhero, LOLheroAdmin)
admin.site.register(LOLcity, LOLcityAdmin)
V视图部分:
28. 定义视图函数,在应用的 views.py 中,定义视图函数
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('Hello World')
29. 在应用中新建一个 urls.py ,并参照系统文件的 urls 添加信息
from django.conf.urls import url
# 严格匹配开头和结尾
urlpatterns = []
30. 修改系统文件的 urls.py 中的内容 添加刚刚新建的urls的路径, 将刚刚创建的应用中的 urls.py 加入到路径中
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
# include包含应用中的urls文件
url(r'^', include('booktest.urls'))
]
31. 当输入网址的时候,系统会自动先在系统的urls中进行正则匹配路径,一旦匹配就会进入路径,之后进入应用的 urls 中匹配,如此先建立一个 index 路径,切记严格匹配开头结尾
当匹配成功,就会进入到应用的 views.py 中执行程序。
from django.conf.urls import url
from booktest import views
# 严格匹配开头和结尾
urlpatterns = [
url(r'^index$', views.index), # 建立/index和视图index之前的关系
]
32. 匹配成功后执行 views.index 中的视图项
T模板部分
流程:创建模板文件夹 ----> 配置模板目录 ----> 渲染模板
33. 在系统配置目录下创建一个 templates 文件夹,用于存放模板,并且,在此文件夹下逐个创建应用的模板文件夹
33. 在刚刚创建的具体应用模板下创建 html 文件,用于视图的调用,render函数 的第二个参数会调用刚刚的模板
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
# return HttpResponse('Hello World')
# render 函数第一个参数必须是request, 第二个参数为模板路径, 第三个参数为要传给模板的变量,用字典存放。
return render(request,'web01/index.html', {'content':'hello world',
'list':list(range(1,10))})
34. 模板可以接收变量,变量放在 {{ }} 中,for 循环放在{% %}中,结尾加{% end for %}
<h1>这是一个模板文件</h1>
使用模板变量<br>
{{ content }}<br>
{{ list }}<br>
for 循环<br>
<ul>
{% for i in list %}
<li>{{ i }}</li>
{% endfor %}
</ul>
34. 重新刷新界面
小练习:访问指定网址显示出LOL城市信息,点击城市显示出其中英雄信息,如果没有英雄则显示没有英雄信息。
每个页面的思路:
1. 设计访问时需要输入的网址
2. 设计模板文件的名字
这个练习分为两个部分,一个是显示城市信息,一个是显示英雄信息
第一部分:
1 .在应用的 urls.py 中设置访问路径, 这里将给视图函数取名 show_city
2. 在 views.py 中设计视图函数 show_city :
3. 设计视图函数时,需要获取城市数据,所以要先从M中导入城市的数据, 通过 render 函数的第三个参数 将数据传给模板
4. 模板获取数据,显示界面
<head>
<meta charset="UTF-8">
<title>英雄联盟城市信息</title>
</head>
<body>
<h1>城邦信息如下</h1>
<ul>
{% for city in citys %}
<li><a href="/citys/{{ city.id }}">{{ city.cname }}</a></li>
{% endfor %}
</ul>
第二部分:
1. 在应用的 urls.py 中设置访问路径,这里时根据城市的ID不同,访问的路径不同来设计,思路很重要。 正则中的()分组,会将数据传递给视图函数
2. 设计视图函数,需要将城市 id 从 urls.py 中传过来,再从M中查询整本书中英雄的信息
3. 最后修改模板,遍历信息
<head>
<meta charset="UTF-8">
<title>显示城市中的英雄人物</title>
</head>
<body>
<h1>{{ city.cname }}</h1>
英雄信息如下:<br>
<ul>
{% for hero in heros %}
<li>{{ hero.hname }}--{{ hero.hcomment }}</li>
{% empty %}
<li>[{{ city.cname }}]没有英雄信息</li>
{% endfor %}
</ul>
效果: