1.MVC设计模式
核心思想:解耦
MVC:Model,View,Controller
Model
:数据以及对数据的方法
View
:数据的显示和呈现
Controller
:收集用户输入,处理用户交互
2.MTV模式
与MVC没有什么区别,也是各组件直接为了保持松耦合关系,只是定义上有些许不同。
3.虚拟环境
基本操作命令
创建虚拟环境 mkvirtualenv 虚拟环境名 -p /usr/bin/python3
进入虚拟环境 workon 虚拟环境名
删除虚拟环境 rmvirtualenv 虚拟环境名
退出虚拟环境 deactivate
查看本机有多少虚拟环境 workon [TAB][TAB]
查看虚拟环境Python中安装的包:pip list
、pip freeze
创建项目:django-admin startproject 项目名
4.项目目录结构
__init__.py
:说明project001是一个python包。
setting.py
:项目的配置文件。
urls.py
:进行url路由的配置。
wsgi.py
:web服务器和Django交互的入口。
manage.py
:管理项目文件。
创建应用:python manage.py startapp 应用名
__init__.py
:说明目录是一个python模块。
models.py
:写和数据库相关的内容。
views.py
:接受请求,进行处理,与M和T进行交互,返回应答。定义处理函数,叫做视图函数,一个函数对应一个请求。
tests.py
:写测试代码的文件。
admin.py
:与网站后台管理相关的文件。
建立应用和项目之间的联系,需要对应用进行注册
修改settings.py
运行项目python manage.py runserver
5.模型类
定义模型类
模型类在应用的model.py内定义。
它继承自models类的Model子类,才是一个模型类。
模型类用于生成数据库表。
from django.db import models
# Create your models here.
#book class
class BookInfo(models.Model):
"""book model class"""
bookTitle = models.CharField(max_length=20) #the name of book
publish_date = models.DateField() #the date of publishing this book
生成迁移文件
python manage.py makemigrations
生成的迁移文件如下:
执行迁移生成表
python manage.py migrate
生成的数据库表存储在哪里?
django默认使用sqlite数据库
安装sqlite sudo apt-get install sqliteman
打卡sqlite sqliteman
通过模型类操作数据库
定义表关系
from django.db import models
# Create your models here.
#book class
class BookInfo(models.Model):
"""book model class"""
bookTitle = models.CharField(max_length=20) #the name of book
publish_date = models.DateField() #the date of publishing this book
#hero in book
#与BookInfo是一对多关系
class Hero(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField(default=True) #true is male
hcomment = models.CharField(max_length=128)
#Build the foreign key relationship between BookInfo and Hero
#定义关系属性
hbook = models.ForeignKey('BookInfo')
关系属性在数据库表内是关系属性名_id
(外键)
举例:
>>> from booktest.models import BookInfo,Hero
>>> b = BookInfo()
>>>b.bookTitle = '3-body'
>>>> from datetime import date
>>> b.publish_date = date(2006,12,21)
>>> b.save()
>>> h = Hero()
>>> h.hname = 'luoji'
>>> h.hgender = True
>>> h.hcomment = 'face-to-wall'
>>> h.hbook = b
>>> h.save()
通过外键所在表类的对象查看与其关联的对象信息(由1查多):
>>> b.hero_set.all()
[<Hero: Hero object>]
查看一个类里所有的对象列表
BookInfo.objects.all()
6.后台管理
后台管理相关文件:admin.py
(1)本地化
语言和时区本地化
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
(2)创建管理员
python manage.py createsuperuser
启动服务器
(3)注册模型类
在应用下的admin.py中注册模型类
from booktest.models import BookInfo
# Register your models here.
admin.site.register(BookInfo)
book info中有一条数据,默认显示为字符串“BookInfo object”,这是调用object对象默认的str()方法导致的,要想人性化显示(显示对象某一属性),则要重写str方法。
class BookInfo(models.Model):
"""book model class"""
bookTitle = models.CharField(max_length=20) #the name of book
publish_date = models.DateField() #the date of publishing this book
#重写str()方法
def __str__(self):
return self.bookTitle
(4)自定义管理页面
在manage.py
内定义模型管理类
#define model management class
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['id','bookTitle','publish_date']
# Register your models here.
admin.site.register(BookInfo,BookInfoAdmin)
7.视图
在Django中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求。视图函数处理之后,要给浏览器返回页面内容。
(1)定义视图函数
应用-views.py
- 定义视图函数
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
#http://127.0.0.1:8000/index
def index(request):
#handle,contract with M and T
return HttpResponse('Hello,world')
- 进行url配置,建立url地址与视图的对应关系
8.模板
模板不仅仅是一个html文件
模板文件的使用:
(1)创建模板文件夹
(2)配置模板目录
settings.py里有个叫做BASE_DIR
的变量,保存项目的绝对路径
在settings.py的TEMPLATES变量配置模板目录
(3)使用模板文件
- 加载模板文件
去模板目录下面获取html文件的内容,得到一个模板对象 - 定义模板上下文
向模板文件传递数据 - 模板渲染
得到一个标准的html内容
模板index.html
如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>this is template</h1>
</body>
</html>
views.py中对应视图函数如下
from django.template import loader,RequestContext
def index(request):
#handle,contract with M and T
#return HttpResponse('Hello,Django')
#1.加载模板文件
temp = loader.get_template('index.html')
#2.定义模板上下文(传数据)
context = RequestContext(request,{})
#3.模板渲染
res_html = temp.render(context)
return HttpResponse(res_html)
可以将以上视图函数封装为一个方法:
def my_render(request,template_path,context_dict={}):
# 1.loading template file
temp = loader.get_template(template_path)
# 2.send data to template
context = RequestContext(request, context_dict)
# 3.make page
res_html = temp.render(context)
return HttpResponse(res_html)
#http://127.0.0.1:8000/index
def index(request):
#handle,contract with M and T
#return HttpResponse('Hello,Django')
return my_render(request,'index.html')
其实,django已经帮我们做了以上封装,我们直接调用render()方法即可
return render(request,'index.html')
在模板中使用变量
return render(request,'index.html',{'content':'hello world'})
<body>
<h1>this is template</h1>
<h2>{{ content }}</h2>
</body>
在模板中使用循环
格式:{% 代码段 %}
return render(request,'index.html',{'content':'hello world','list':list(range(0,11))})
<ul>
{% for i in list %}
<li>{{ i }}</li>
{% endfor %}
</ul>