Django 是由python 语言写的开源web 开发框架,并遵循MVC 设计模式,自称MVT 框架。
Model:数据处理,内嵌ORM 框架;
View:与MVC 的C 功能相同,接收HttpRequest,业务处理返回HttpResponse;
Temp:与MVC 的V 功能相同,展示层(html),内嵌了模板引擎。
起初是为了开发以新闻发布为主的网站,而开发出这个框架。
所以该框架更适合制作CMS (内容管理)系统。
【sudo pip install 包名词】的形式进行安装时,默认路径为【/usr/bin/local/python2.7/disk-package】,当相同内容进行安装时,则会出现覆盖问题,不理想。
虚拟环境:针对不同项目安装的一堆包的集合,可以将不同项目分隔开来。
# pip3 安装
sudo apt install python3-pip
# 安装虚拟环境(home/.virtualenvs/所有虚拟环境)
pip3 install virtualenv
# 安装虚拟环境命令的封装的包
pip3 install virtualenvwrapper
# 查看是否安装成功
pip3 list
virtualenv(xxx)
virtualenv-clone(xxx)
virtualenvwrapper(xxx)
# 添加环境变量(gedit ~/.bashrc 打开文件最下放追加下列两行代码,保存后退出)
# 若不保存,重新打开命令行后无法使用workon 进入虚拟环境
export WORKON_HOME=$HOME/.virtualenvs
source ~/.local/bin/virtualenvwrapper.sh
# 生效
source ~/.bashrc
# 虚环境名称
mkvirtualenv py_django
# 退出
deactivate
# 进入虚拟环境
workon py_django
# 当前所用的python
which python
输出:
/home/itheima/.virtualenvs/py_django/bin/python
否则输出:
/usr/bin/python
# 补充
# 查看所有虚拟环境
workon tab tab
# 删除虚拟环境(先退出)
rmvirtualenv 虚拟环境名称
# 安装包
# sudo会将包安装到/usr/bin/目录下,用pip install 安装的包在当前虚拟环境中
pip install django==1.8.2
# 进入虚拟环境
workon py_django
# 进入 py_django虚拟环境目录
/home/itheima/.virtualenvs/py_django
# 创建项目
# django-admin statrproject 项目名词
django-admin startproject test1
# 项目地址
/home/itheima/.virtualenvs/py_django/test1
# 提示:做项目时尽量在home 目录下操作,如果在跟目录下做的话,容易出现权限问题,每次都输入sudo 效率低
# 项目默认生成的子文件
test1 # 项目名
├── manage.py # 项目入口
└── test1 # 与项目同名的模块
├── __init__.py # 默认是一个空文件
├── settings.py # 设置文件
├── urls.py # url 配置文件
└── wsgi.py # 发布
# test1 项目中创建应用
# 进入test1 项目目录
(py_django) itheima@ubuntu:~/.virtualenvs/py_django/test1
应用:按功能将项目划分为多个应用
# 进入 test1项目目录
/home/itheima/.virtualenvs/py_django
# 创建应用
python manage.py startapp booktest
test1 # 项目名
├── booktest # 应用名
│ ├── admin.py # 后台管理文件
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations # 数据迁移
│ │ └── __init__.py
│ ├── models.py # 数据处理层
│ ├── tests.py # 简单的测试(一般自定义)
│ └── views.py # 控制层
# 应用安装到settings.py 中
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booktest',
]
from django.db import models
class BookInfo(models.Model):
title = models.CharField(max_length=20)
pub_date = models.DateField()
class HeroInfo(models.Model):
name = models.CharField(max_length=10)
content = models.CharField(max_length=100)
gender = models.BooleanField(default=True)
book = models.ForeignKey(BookInfo)
# 进入项目目录
(py_django) itheima@ubuntu:~/.virtualenvs/py_django/test1
python manage.py makemigrations
Migrations for 'booktest':
0001_initial.py:
- Create model BookInfo
- Create model HeroInfo
# booktest/migrations 中会生成 0001_initial.py 文件,是一个sql脚本
根据迁移文件创建表
python manage.py migrate
运行:
Applying booktest.0001_initial... OK
生成数据库和表
db.sqlite3
# 进入项目的shell,进行简单的API 操作
# 进入shell(退出用 quit())
python manage.py shell
# 查询所有
>>> from booktest.models import BookInfo
>>> BookInfo.objects.all()
结果:[]
# 追加信息
>>> b=BookInfo()
>>> b.title = '水浒传'
>>> from datetime import date
>>> b.pub_date=date(2020,5,5)
>>> b.save()
结果:[<BookInfo: BookInfo object>]
# 显示追加内容
class BookInfo(models.Model):
title = models.CharField(max_length=20)
pub_date = models.DateField
def __str__(self):
return self.title
# 修改代码,shell 需要重新进入
结果:[<BookInfo: 水浒传>]
# 修改内容
>>> b = BookInfo.objects.get(id=1)
>>> b.title='神雕侠侣'
>>> b.save()
>>> BookInfo.objects.all()
结果:[<BookInfo: 神雕侠侣>]
# 删除
>>> b.delete()
>>> BookInfo.objects.all()
结果:[]
>>> from booktest.models import HeroInfo
>>> h = HeroInfo()
>>> h.name = '李逵'
>>> h.gender = True
>>> h.content = '耍板斧'
>>> h.book = BookInfo.objects.get(id=2)
>>> h.book_id = 2
>>> h.save()
>>> HeroInfo.objects.all()
[<HeroInfo: HeroInfo object>]
>>>
>>> book = BookInfo.objects.get(id=2)
>>> book
<BookInfo: 水浒传>
>>> book.heroinfo_set.all()
[<HeroInfo: HeroInfo object>]
>>> h.book
<BookInfo: 水浒传>
# 创建
book = BookInfo()
book.xx = xx
book.save()
# 修改
book = BookInfo.objects.get(id=xxx)
book.xx = xx
book.save()
# 删除
book.delete()
# 查询
BookInfo.objects.all()
BookInfo.objects.get()
# 关系
book.heroinfo_set.all()
hero.book
pthon manage.py createsuperuser
运行:
(py_django) itheima@ubuntu:~/.virtualenvs/py_django/test1$ python manage.py createsuperuser
Username (leave blank to use 'itheima'): python
Email address: aaa@163.cn
Password:
Password (again):
Superuser created successfully.
python manage.py runserver
运行:
(py_django) itheima@ubuntu:~/.virtualenvs/py_django/test1$ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
May 23, 2020 - 14:27:18
Django version 1.8.2, using settings 'test1.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
提示:对于启动中的服务器,代码修改后,服务器会自动重启
浏览器访问【http://127.0.0.1:8000/admin】可进入管理界面
默认英文,汉化语言及时区(settings.py 文件)
# LANGUAGE_CODE = 'en-us'
# TIME_ZONE = 'UTC'
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
后台页面显示自定义内容(admin.py 文件)
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
admin.py 文件
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['id','title','pub_date']
admin.site.register(BookInfo,BookInfoAdmin)
配置url (正则表达式, 视图)
接收url 请求,获取url 项目名称后面的地址,与所有配置的url 进行匹配,寻找视图
# 1.浏览器请求
http://127.0.0.1:8000/index/
# 2.test1/urls.py 中添加应用关联文件,便于多应用管理
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url('^', include('booktest.urls')),
]
# 3.booktest 应用中添加 urls.py 文件,管理该应用中的所有url匹配问题
from django.conf.urls import url
from .views import *
urlpatterns = [
url('^index/$', index)
]
# 4.应用的 views.py 文件中创建 url 与 页面的映射
from django.shortcuts import render
from django.http import HttpResponse
# HttpRequest 中封装了所有的请求信息,浏览器的请求报文
def index(request):
# HttpResponse 响应报文
return HttpResponse('hello word')
# 5.页面响应结果
hello word
# 1.创建模板
# test1/templates/booktest/index.html
# 2.指定返回的页面,简写路径(views.py 中)
from django.shortcuts import render
from django.http import HttpResponse
# HttpRequest 中封装了所有的请求信息,浏览器的请求报文
def index(request):
# HttpResponse 响应报文
# return HttpResponse('hello word')
# render:视图中调用模板
return render(request,'booktest/index.html')
# 3.补全路径 settings.py
EMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# BASE_DIR 为当前项目所在目录
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
...
]
render 补充说明(了解)
# render:django 对下列代码的封装方法
from django.http import HttpResponse
from django.template import loader,RequestContext
def index(request):
# 1.获得模板
template = loader.get_temlpate('booktest/index.html')
# 2.定义上下文
context = RequestContext(request,['title':'图书列表','list':range(10)])
# 3.渲染模板
return HttpRespose(template.render(context))
# 1.模板设定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{title}}</title>
</head>
<body>
<h1>Hello World</h1>
<hr>
<!--循环输出-->
{%for i in list%}
<h1>{{i}}</h1>
{%endfor%}
</body>
</html>
# 2.控制层向页面传值
from django.shortcuts import render
from django.http import HttpResponse
# HttpRequest 中封装了所有的请求信息,浏览器的请求报文
def index(request):
# HttpResponse 响应报文
# return HttpResponse('hello word')
context = {'title':'django 首页','list':range(10)}
return render(request,'booktest/index.html',context)
# 模板语言取值
获取图书列表信息(views.py)
from django.shortcuts import render
from django.http import HttpResponse
from .models import *
# HttpRequest 中封装了所有的请求信息,浏览器的请求报文
def index(request):
# HttpResponse 响应报文
list = BookInfo.objects.all()
context = {'booklist':list}
return render(request, 'booktest/booklist.html', context)
显示所有书(booklist.html),点击图书查看人物
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书列表</title>
</head>
<body>
<ul>
{%for book in booklist%}
<li><a href="/{{book.id}}/">{{book.title}}</a></li>
{%endfor%}
</ul>
</body>
</html>
点击图书显示英雄明细(booktest/urls.py)
# url 映射
from django.conf.urls import url
from .views import *
urlpatterns = [
url('^$', index),
url('^(\d+)/$', detail)
查询图书中描写的人物(views.py)
def detail(request,id):
list = BookInfo.objects.get(id=id).heroinfo_set.all()
content = {'herolist':list}
return render(request,'booktest/detail.html',content)
英雄列表明细模板设定(detail.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>英雄列表</title>
</head>
<body>
<a href="/index">首页</a>
<hr>
<ul>
{%for hero in herolist %}
<li>{{hero.name}}</li>
{%endfor%}
</ul>
</body>
</html>
1 模型类 M
1.1 在Models.py 中定义模板类
1.2 生成迁移
1.3 执行迁移
2 注册admin
2.1 创建超级管理员
2.2 注册模板类
2.3 登陆后台管理数据
3 视图 V
3.1 在views.py 中定义视图
3.2 配置url
4 模板 T
4.1 配置settings.py
4.2 创建目录及文件
4.3 编辑模板文件
4.4 在视图中调用