一、环境配置
(1)安装python(3.6)
1.下载安装包: www.python.org/downloads/r…
2.Linux系统一般默认安装Python2.7,如使用Python3.6自行编译安装
3.MacOS和Windows点击对应安装包,进行"下一步"操作即可
(2)安装pip
1. 下载压缩包:pypi.org/project/pip…
2. 解压并进入目录执行命名:
$ python setup.py install
3. 将C:\Python36\Scripts;
添加至path环境变量,否则无法使用pip命令
4. cmd中输入pip可查看其帮助
(3)安装django
1. 安装
$ pip install django
2. 添加环境变量path
C:Python36\Lib\site-packages
3. 查看django命令 $ django-admin help
如下图说明安装成功
二、创建项目及应用
(1)命令行创建项目,myapp为项目目录名称: λ django-admin startproject myapp
新建成功时没有任何提示如下图,当前目录内生成myapp
目录
(2)进入项目目录 如下图
(3)如图,根目录包含入口文件mange.py
和同名目录myapp/
(4)初始化目录结构如上图
-myapp : 项目根目录
-myapp : 自动生成的同名模块,存放项目配置文件
__init__.py : 空文件, 用来告诉python当前目录是python模块
settings.py : 包含项目所有配置参数
urls.py : URL根配置
wsgi.py : 内置runserver命令的WSGI兼容的web服务器入口
-manage.py : 应用的入口文件复制代码
(5)创建应用,一个应用编写代码开发一个业务模块,booker为自定义应用名称
λ python manage.py startapp booker
(6)如上图 生成booker目录
-myapp : 项目根目录
-booker : 应用名称(目录)
-migrations : 数据迁移文件目录, 初始化时内部只有一个空文件 __init__.py
__init__.py : 告诉python目录booker为一个python模块
admin.py : 用于开发后台管理文件
apps.py : 对应应用的setting设置,1.9版本后从settings.py分割出来.
models.py : 用于模型开发
tests.py : 用于单元测试
views.py : 用于视图开发复制代码
(7)将booker应用添加到settings.py
文件下
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booker',
]复制代码
(8)运行项目 λ python manage.py runserver 8080
, 端口默认为8000,
下图红色部分提示是因为有迁移文件未执行迁移, 可执行 λ python manage.py migrate
生成表,也可等创建完模型类后一并执行.
三、创建模型类
项目是基于数据驱动,使用ORM操作将模型对象转换为关系型数据库
1. 打开应用的models.py
定义两个模型类BookInfo
和HeroInfo
from django.db import models
# Create your models here.
# 模型类若要与数据库交互必须继承于models.Model类
# 创建BookInfo模型类
# 定义字段属性title, pub_date,类型分别为CharField和DateField并为字符串定义条件
class BookInfo(models.Model):
"""docstring for BookInfo"""
title = models.CharField(max_length=30)
pub_date = models.DateField()
def __str__(self):
return self.title
# 创建HeroInfo模型类
# 定义字段name,gender,skill,intro,book
# book定义为外键,关联模型BookInfo,
# Django2.0+版本设置外键时需填写on_delete参数否则报异常,参考<Django2.0关联表必填on_delete参数>
class HeroInfo(models.Model):
"""docstring for HeroInfo"""
name = models.CharField(max_length=20)
gender = models.BooleanField(default=True)
skill = models.CharField(max_length=200)
intro = models.CharField(max_length=300)
book = models.ForeignKey('BookInfo', on_delete=models.CASCADE)
def __str__(self):
return self.name复制代码
参考 : <Django2.0关联表必填on_delete参数>
2 . 生成迁移文件并执行迁移
命令行λ python manage.py makemigrations
后左侧项目内migrations目录生成0001_initial.py
迁移文件
命令行λ python manage.py migrate
生成db.sqlite3数据文件
3. 到此数据模型类创建完毕 ,接下来可在django自带的交互环境λ python manage.py shell
操作数据,也可以跳到第四步登录后台进行操作, 以下是交互环境下简单的数据库操作
In [1]: from booker.models import BookInfo # 导入应用模块
In [2]: BookInfo.objects.all() # 查询所有
Out[2]: <QuerySet []> # 首次为空列表
In [3]: book = BookInfo() # 创建实例对象book
In [4]: book.title='笑傲江湖' # 添加属性值
In [5]: from datetime import date # 导入时间模块
In [6]: book.pub_date=date(1999,10,1) # 添加属性值
In [7]: book.save() # 保存对象
In [9]: BookInfo.objects.all() # 查询所有数据
Out[9]: <QuerySet [<BookInfo: 笑傲江湖>]> # 显示已添加数据, 如不显示内容需在BookInfo模型中定义方法def __str__(self)
In [10]: BookInfo.objects.get(id=1) # 根据id获取对象
Out[10]: <BookInfo: 笑傲江湖>
In [11]: book = BookInfo.objects.get(id=1) # 查找指定对象
In [12]: book.title = '倚天屠龙记' # 修改属性值
In [13]: book.save() # 修改后需保存
In [14]: BookInfo.objects.get(id=1) # 再次查询
Out[14]: <BookInfo: 倚天屠龙记> # title已被修改
In [17]: book.delete() # 删除对象
Out[17]: (1, {'booker.HeroInfo': 0, 'booker.BookInfo': 1})
In [18]: BookInfo.objects.all()
Out[18]: <QuerySet []> # 删除后空列表
# HeroInfo数据库操作类似,不同在于关联部分, 与BookInfo关联前需填充BookInfo数据
In [19]: from booker.models from HeroInfo # 导入HeroInfo模型
.... # 添加属性值略
In [20]: book=BookInfo.objects.get(id=1) # book属性定义为BookInfo列表指定对象
In [21]: book
Out[21]: <BookInfo: 倚天屠龙记>
In [22]: book.heroinfo_set.all() # 显示book对象对应的heroinfo列表
Out[22]: [<HeroInfo: HeroInfo object>]复制代码
四、后台管理
1 . 创建超级管理员账号λ python manage.py createsuperuser
: 账号,邮箱,密码,密码确认
2 . 运行服务λ python manage.py runserver 8080
输入后台 http://127.0.0.1:8080/admin/
,
输入账号密码登录后台.
3 . 改为中文界面,回到编辑器 myapp/myapp/settings.py
, 把红线标记部分修改后刷新后台页面即可改成中文
LANGUAGE_CODE = 'zh-Hans' # 1.8版本后使用的中文
TIME_ZONE = 'Asia/Shanghai' # 中国时区
复制代码
4 . 注册模型类,并在后台显示已创建的模型类
回到编辑器 myapp/booker/admin.py
, 编写以下代码后刷新浏览器
from django.contrib import admin
from booker.models import * # 引入模型类, 2.0版本根路径基于myapp开始
# Register your models here.
# 2 .显示模型类字段,并继承admin.ModelAdmin模块
class BookInfoAdmin(admin.ModelAdmin):
"""docstring for BookInfoAdmin"""
# 后台显示的字段
list_display = ['id','title','pub_date']
class HeroInfoAdmin(admin.ModelAdmin):
"""docstring for HeroInfoAdmin"""
list_display = ['id','name','gender','skill','intro', 'book']
# 1. 注册模型类
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)
复制代码
5 . 点击进入Book infos
和Hero infos
表进行CRUD操作, 注意低版本django进入修改可能会出现编码错误提示'UnicodeEncodeError'
, 原因是models中类定义的def __str__(self)
方法返回了中文, 需后面添加 .encode('utf-8')
五、创建视图
1 . 在应用booker/views.py
编写视图函数
from django.shortcuts import render
from django.http import HttpRequest
from booker.models import *
# Create your views here.
#HttpRequest
def index(request): # 函数名自定义,对应url路由
# HttpResponse
return HttpResponse('<h2>首页</h2>')
复制代码
2 . 配置url路由: 新建应用子路由booker/urls.py
# 配置路由url
from django.urls import path
from booker import views
urlpatterns = [
path('',views.index), # 指向booker/views.py的index
]
复制代码
3 . 将子路由模块urls.py添加到项目myapp/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls), # 旧版本可能使用url(),2.0推荐使用path()
path('',include('booker.urls')) # 指向booker/urls.py模块, 2.0以上须使用include否则报异常
]
复制代码
4 . 刷新http://127.0.0.1:8080/
显示"首页" , 路由访问的顺序是: manage.py-->myapp/settings.py-->myapp.urls.py-->booker/urls.py-->booker/views.py-->index-->模板文件
六、创建模板
1 . 创建模板 myapp/templates/booker/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h2>首页</h2>
</body>
</html>
复制代码
2. 修改之前新建的booker/views.py
下的index方法,将return HttpResponse()改为return render()
#HttpRequest
def index(request):
# HttpResponse
# return HttpResponse('<h2>首页</h2>') # 修改前
return render(request, 'booker/index.html') # 修改后
复制代码
3 . 此时还需配置模板文件的根目录, 进入myapp/settings.py
'DIRS': [os.path.join(BASE_DIR, 'templates')],
4 . 刷新浏览器,模板渲染成功,页面显示正常.
七、数据渲染
1 . 变量使用, 修改booker/views.py
from django.shortcuts import render
from django.http import HttpResponse
from booker.models import * # 导入模型类
# Create your views here.
#HttpRequest
def index(request):
# HttpResponse
# return HttpResponse('<h2>首页</h2>')
title = 'Django首页' # 定义变量title
booklist = BookInfo.objects.all() # 定义变量booklist,从模型BookInfo获取数据
context = { # 定义字典,保存变量
'title': title,
'books': booklist
}
return render(request, 'booker/index.html', context) # render第三个参数传入字典
复制代码
2 . 模板booker/index.html
接收变量
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h2>首页</h2>
<ul>
{% for book in books %}
<li><a href="/{{ book.id }}/">{{ book.title }}</a></li>
{% endfor %}
</ul>
</body>
</html>
复制代码
3 . 刷新浏览器,显示后台BookInfo数据
4 . 添加详情页路由, 添加到booker/urls.py
# 配置路由
from django.urls import path, re_path
from booker import views
urlpatterns = [
path('', views.index),
re_path('detail/(\d+)/',views.detail),
# 详情页路由,使用正则匹配时应用re_path()方法
#正则表达式第一个()对应detail方法第二个参数,依次类推
]复制代码
参考re_path() juejin.im/post/5aeed5…
5 . 修改模板booker/index.html
, 如路由中不使用detail前缀则不用修改
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h2>首页</h2>
<hr>
<ul>
{% for book in books %}
<li><a href="/detail/{{ book.id }}/">{{ book.title }}</a></li>
{% endfor %}
</ul>
</body>
</html>
复制代码
6 . booker/views.py
添加detail方法
def detail(request, id): # id为路由传入的值
book = BookInfo.objects.get(id=id) # 根据id查找书名
heros = book.heroinfo_set.all() # 根据书名查找heros
context = {
'book': book,
'heros': heros
}
return render(request, 'booker/detail.html', context)
复制代码
7 . 新建booker/detail.html
模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ book.title }}</title>
</head>
<body>
<a href="/">返回首页</a>
<hr>
<h2>book详情</h2>
<div>
<h3>书名: {{ book.title }}</h3>
<p>日期: {{ book.pub_date }}</p>
</div>
<div>
<h3>英雄列表</h3>
<ul>
{% for hero in heros %}
<li>
<div>姓名: {{ hero.name }}</div>
<div>性别:
{% if hero.gender == True%}
<span>男</span>
{% else %}
<span>女</span>
{% endif %}
</div>
<div>技能: {{ hero.skill }}</div>
<div>简介: {{ hero.intro }}</div>
</li>
{% endfor %}
</ul>
</div>
</body>
</html>
复制代码
8 . 回到浏览器刷新页面, 点击列表即可进入详情页面
八、总结(思维导图)