Django中内嵌了ORM框架,ORM框架可以将类和数据表进行对应起来,只需要通过类和对象就可以对数据表进行操作
ORM的作用就是根据设计的类生产数据库的表,并且数据库的表进行操作。
1.模型_模型类设计和表生成
1.在应用文件夹models.py中创建图书类
from django.db import models
# Create your models here.
# 图书类(必须要继承modls)
class BookInfo(models.Model):
'''图书模型类'''
# 图书名称,charField说明是一个字符窜,max_length指定字符窜的最大长度
btitle = models.CharField(max_length=20)
# 出版日期,DateField说明是一个日期类型
bpub_date = models.DateField()
def __str__(self):
# 返回书名
return self.btitle
2.生成迁移文件
python manage.py makemigrations
3.执行迁移生成表(根据迁移文件生成表)
python manage.py migrate
4.Django默认的数据库是sqliteman,查看需要安装
https://blog.csdn.net/dyxcome/article/details/85240232
# 安装
sudo apt-get install sqliteman
# 如无法安装,解决方法,编辑源文件
sudo vi /etc/apt/sources.list
# 添加源
deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
# 再更新软件列表
sudo apt-get update
# 启动
sqliteman
2.通过模型类操作数据表
5.进入项目shell命令
python manage.py shell
from booktest.models import BookInfo
from datetime import date
# 增
b1 = BookInfo()
b1.btitle = '天龙八部'
b1.bpub_date=date(1990,1,1)
b1.save()
# 查
b2 = BookInfo.objects.get(id=1)
b2.btitle
>>>'天龙八部'
b2.bpub_date
>>>datetime.date(1990, 1, 1)
# 改
b2.bpub_date=date(1989,10,10)
b2.save()
# 删
b2.delete()
>>>(1, {'booktest.HeroInfo': 0, 'booktest.BookInfo': 1})
3.模型类关系和关系查询
6.在models.py创建英雄人物类
class HeroInfo(models.Model):
'''英雄人物类'''
# 字符窜
hname = models.CharField(max_length=20)
# 布尔
hgender = models.BooleanField(default=False)
# 备注
hcomment = models.CharField(max_length=128)
# 外键
# 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,
# 此参数为了避免两个表里的数据不一致问题,不然会报错:
# TypeError: init() missing 1 required positional argument: ‘on_delete’
# 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:
# TypeError: init() missing 1 required positional argument: ‘on_delete’
# 举例说明:
# user=models.OneToOneField(User)
# owner=models.ForeignKey(UserProfile)
# 需要改成:
# user=models.OneToOneField(User,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值
# owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值
# 参数说明:
# on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
# CASCADE:此值设置,是级联删除。
# PROTECT:此值设置,是会报完整性错误。
# SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
# SET_DEFAULT:此值设置,会把设置为外键的默认值。
# SET():此值设置,会调用外面的值,可以是一个函数。
# 一般情况下使用CASCADE就可以了。
hbook = models.ForeignKey('BookInfo',on_delete=models.CASCADE)
def __str__(self):
return self.hname
7.重新生成迁移文件和数据表
python manage.py makemigrations
python manage.py migrate
8.插入数据
from .booktest.models import *
from datetime import date
# 创建书类
b = BookInfo()
b.btitle='天龙八部'
b.bpub_date=date(1990,1,1)
b.save()
# 创建英雄类
h=HeroInfo()
h.hname='段誉'
h.hgender=False
h.hcomment='六脉神剑'
h.hbook=b
h.save()
# 如果中途退出,可重新定义
b = BookInfo.objects.get(id=4)
# 创建英雄实例
def hero(name,gender,comment,book):
h=HeroInfo()
h.hname=name
h.hgender=gender
h.hcomment=comment
h.hbook=book
h.save()
hero('乔峰',False,'降龙十八掌',b)
hero('段誉',False,'六脉神剑',b)
hero('虚竹',False,'天山折梅手',b)
# 查询对象属性
h3 = HeroInfo.objects.get(id=1)
h3.hname
# 查询一类中所有多类信息
b.heroinfo_set.all()
# 查询图书表中所有内容
BookInfo.objects.all()
HeroInfo.objects.all()
4.后台管理
1.本地化,修改setting.py语言和市区
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
2.创建管理员(终端)
python manage.py createsuperuser
3.启动服务
python manage.py runserver
4.打开本地浏览器,输入登录密码
http://127.0.0.1:8000/admin/
5.在应用下的admin.py中注册模型类,告诉Django框架更加注册的模型类来生成对应的表管理页面
注册显示的表
from django.contrib import admin
from .models import BookInfo,HeroInfo
# 注册模型类到后台
# 控制在后台显示哪些表
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
注册显示的字段
from django.contrib import admin
from .models import BookInfo,HeroInfo
# Register your models here.
# 自定义模型管理类
class BookInfoAdmin(admin.ModelAdmin):
'''控制在后台宣示什么字段'''
list_display = ['id','btitle','bpub_date']
class HeroInfoAdmin(admin.ModelAdmin):
'''控制在后台宣示什么字段'''
list_display = ['id','hname','hgender','hcomment','hbook']
# 注册模型类到后台
# 控制在后台显示哪些表
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)
5.视图函数的使用
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):
# 进行处理,和M/T进行交互
return HttpResponse('首页')
def book1(request):
return HttpResponse('天龙八部')
def book2(request):
return HttpResponse('倚天屠龙记')
2.进行url配置,建立url地址和视图的对应关系
在booktest应用文件夹中创建urls.py文件,并输入
booktest/urls.py(应用中的urls.py)
from django.urls import path,include,re_path
from . import views
# 严格匹配开头和结尾
urlpatterns = [
# 通过url函数设置url路由配置项
# 首页
path('',views.index),
# 分页
re_path(r'^book1',views.book1), # 建立和视图index之间的关系
re_path(r'^book2',views.book2),
]
django_01/urls.py(项目的urls.py)
from django.contrib import admin
from django.urls import path,include,re_path
# 项目的url文件
urlpatterns = [
path('admin/', admin.site.urls), # 配置项目
# 首页
re_path('',include("booktest.urls")), # 包含booktest下的url.py文件
# 分页
re_path('^book.*',include("booktest.urls")), # 包含booktest下的url.py文件
]
6.模板使用
1.创建模板文件夹templates,并在其下创建一个与booktest应用对应的模板文件夹
2.在django_01/setting.py中设置模板路径
'DIRS': [os.path.join(BASE_DIR,'templates')],
3.创建templates/booktest中创建html模型文件
4.在应用文件夹的views.py中调用html,(重点理解调用的原理)
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
# Create your views here.
# render原理
def my_render(template_path,context_dict={}):
'''使用模板文件'''
# # 加载模板文件,返回模板对象
tempObject = loader.get_template(template_path)
# # 定义模板上下文,给模板文件传递数据,传递的是键值对
context = context_dict
# # 模板渲染,产生标准的html内容
result_html = tempObject.render(context)
# # 返回html
return HttpResponse(result_html)
# http://127.0.0.1:8000/index
def index(request):
# 进行处理,和M/T进行交互
# return HttpResponse('首页')
return my_render('booktest/index.html')
5.调用框架内置的render函数便能实现my_render函数的功能
# http://127.0.0.1:8000/index
def index(request):
# 进行处理,和M/T进行交互
# return HttpResponse('首页')
# return my_render('booktest/index.html')
return render(request,'booktest/index.html')
6.在views.py中传入数据content和list
# http://127.0.0.1:8000/index
def index(request):
# 进行处理,和M/T进行交互
# return HttpResponse('首页')
# return my_render('booktest/index.html')
return render(request,'booktest/index.html',
{'content':'hello world',
'list':list(range(1,10),)})
7.在html中写入对应的变量content和list
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板文件</title>
</head>
<body>
<h1>This is a model file.</h1>
<br>使用模板变量:<br/>
<br>{{content}}<br/>
<br>使用列表:<br/>
<br>{{ list }}<br/>
<br>----<br/>
<br>for循环<br/>
<ul>
{% for i in list%}
<li>{{i}}</li>
{%endfor%}
</ul>
</body>
</html>
综合运用
1创建templates/booktest/show_books.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示书名</title>
</head>
<body>
<p>图书信息如下:</p>
<ul>
{% for i in books %}
<li>
# 返回链接路由
<a href="/books/{{i.id}}">{{i.btitle}}</a>
</li>
{% endfor %}
</ul>
</body>
</html>
2.创建templates/booktest/detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示人物信息</title>
</head>
<body>
<h1>{{book.btitle}}</h1>
英雄信息如下:<br>
<ul>
{%for i in heros%}
<li>{{i.hname}}---{{i.hcomment}}</li>
{% empty %}
<li>没有英雄信息</li>
{%endfor%}
</ul>
</body>
</html>
3.修改应用路由booktest/urls.py
from django.urls import path,include,re_path
from . import views
# 严格匹配开头和结尾
urlpatterns = [
# 通过url函数设置url路由配置项
# 首页
path('',views.index),
# 分页
re_path(r'^book1$',views.book1), # 建立和视图index之间的关系
re_path(r'^book2$',views.book2),
re_path(r'^books$',views.show_books),
re_path(r'^books/(\d+)$',views.detail),
]
4.修改应用视图booktest/views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
from .models import BookInfo
# Create your views here.
# render原理
def my_render(template_path,context_dict={}):
'''使用模板文件'''
# # 加载模板文件,返回模板对象
tempObject = loader.get_template(template_path)
# # 定义模板上下文,给模板文件传递数据,传递的是键值对
context = context_dict
# # 模板渲染,产生标准的html内容
result_html = tempObject.render(context)
# # 返回html
return HttpResponse(result_html)
# http://127.0.0.1:8000/index
def index(request):
# 进行处理,和M/T进行交互
# return HttpResponse('首页')
# return my_render('booktest/index.html')
return render(request,'booktest/index.html',
{'content':'hello world',
'list':list(range(1,10),)})
# 由路由引导到此函数,通过M模型查询数据,返回html页面
def show_books(request):
# 通过M查找图书表中的数据
books = BookInfo.objects.all()
# 使用模板
return render(request,'booktest/show_books.html',
{'books':books})
# 由正则路由传递数据到此函数,通过M模型查询数据,返回html页面
def detail(request,bid):
'''查询图书类的关联英雄信息'''
# 根据id查询图书信息
book = BookInfo.objects.get(id=bid)
# 查询和book关联的英雄信息
heros = book.heroinfo_set.all()
# 把数据传递给模板
return render(request, 'booktest/detail.html',
{'book':book,'heros': heros})
def book1(request):
return HttpResponse('天龙八部')
def book2(request):
return HttpResponse('倚天屠龙记')