关键词:
案例效果如下:
- 打开 /booktest/显示书籍列表
- 点击新增,增加一条数据
- 点击删除,删除一条数据
- 点击查看,跳转英雄信息界面
1.定义模型类
打开booktest/models.py文件,定义模型类如下
from django.db import models
# Create your models here.
# 定义书籍模型类
class BookInfo(models.Model):
btitle = models.CharField(max_length=20) # 书籍名称
bpub_date = models.DateField() # 发布日期
bread = models.IntegerField(default=0) # 阅读量
bcomment = models.IntegerField(default=0) # 评论量
isDelete = models.BooleanField(default=False) # 逻辑删除
# 定义英雄模型类
class HeroInfo(models.Model):
hname = models.CharField(max_length=20) # 英雄姓名
hgender = models.BooleanField(default=True) # 英雄性别,True为男
hcomment = models.CharField(max_length=200) # 英雄描述信息
hbook = models.ForeignKey(BookInfo, on_delete=models.DO_NOTHING) # 英雄与书籍关系为一对多
2.迁移
python manage.py makemigrations
python manage.py migrate
表bookinfo结构如下:
注意:默认值并不在数据库层面生效,而是在django创建对象时生效。
表booktest_heroinfo结构如下:
注意:Django框架会根据关系属性生成一个关系字段,并创建外键约束。
3.导入测试数据
在数据库命令行中,复制如下语句执行,向booktest_bookinfo和booktest_heroinfo表中插入测试数据:
insert into booktest_bookinfo(id,btitle,bpub_date,bread,bcomment,isDelete) values
(1,‘射雕英雄传‘,‘1980-5-1‘,12,34,0),
(2,‘天龙八部‘,‘1986-7-24‘,36,40,0),
(3,‘笑傲江湖‘,‘1995-12-24‘,20,80,0),
(4,‘雪山飞狐‘,‘1987-11-11‘,58,24,0);
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment) values
(‘郭靖‘,1,1,‘左右互搏‘),
(‘黄蓉‘,0,1,‘打狗棍法‘),
(‘黄药师‘,1,1,‘弹指神通‘),
(‘欧阳锋‘,1,1,‘蛤蟆功‘),
(‘梅超风‘,0,1,‘九阴白骨爪‘),
(‘乔峰‘,1,2,‘降龙十八掌‘),
(‘段誉‘,1,2,‘六脉神剑‘),
(‘虚竹‘,1,2,‘天山六阳掌‘),
(‘王语嫣‘,0,2,‘神仙姐姐‘),
(‘令狐冲‘,1,3,‘独孤九剑‘),
(‘任盈盈‘,0,3,‘弹琴‘),
(‘岳不群‘,1,3,‘华山剑法‘),
(‘东方不败‘,0,3,‘葵花宝典‘),
(‘胡斐‘,1,4,‘胡家刀法‘),
(‘苗若兰‘,0,4,‘黄衣‘),
(‘程灵素‘,0,4,‘医术‘),
(‘袁紫衣‘,0,4,‘六合拳‘);
4.定义视图
打开booktest/views.py文件,定义视图代码如下:
import datetime
from django.shortcuts import render, redirect, get_object_or_404
from booktest.models import BookInfo, HeroInfo
from django.http import HttpResponse, Http404
# Create your views here.
# 查看所有书籍
def index(request):
books = BookInfo.objects.all()
context = ‘title‘: ‘书籍列表‘, ‘books‘: books
return render(request, ‘booktest/index.html‘, context)
# 新增书籍
def create(request):
book = BookInfo()
book.btitle = "流星蝴蝶剑"
book.bpub_date = datetime.date(1995, 12, 30)
book.bread = 0
book.bcomment = 0
book.save()
return redirect("/booktest/")
# 删除书籍
def delete(request, bid):
# try:
# book = BookInfo.objects.get(id=int(bid))
# book.delete()
# return redirect("/booktest/index")
# except:
# raise Http404("书籍不存在")
book = get_object_or_404(BookInfo, id=int(bid), ) # get_object_or_404() 为快捷函数,不能自定义404显示信息
book.delete()
return redirect("/booktest/")
# 查看英雄信息
def hero_info(request, bid):
heros = HeroInfo.objects.filter(hbook_id=int(bid))
for hero in heros:
if hero.hgender:
hero.hgender = "男"
else:
hero.hgender = "女"
context = ‘title‘: ‘英雄信息‘, ‘heros‘: heros
return render(request, "booktest/heroInfo.html", context)
redirect方法是在执行完代码后,将界面重定向到index界面,使用时需要import导入
5.配置url
打开test1/urls.py文件,配置url如下:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path(‘admin/‘, admin.site.urls),
path(‘booktest/‘, include(‘booktest.urls‘)), # booktest/ 可以为空白
]
在booktest应用下创建urls.py文件,代码如下:
from django.urls import path
from django.urls import re_path
from booktest import views
urlpatterns = [
# ex: /booktest/ # 调用index视图函数
path(‘‘, views.index, name=‘index‘),
# ex: /booktest/create # 调用create视图函数
path(‘create‘, views.create),
# ex: /booktest/delete/1
# re_path(‘delete/(d+)‘, views.delete), # 在path中使用正则时需要导入re_path方法
path(‘delete/<int:bid>‘, views.delete), # bid为视图函数的的形参名
path(‘heroInfo/<int:bid>‘, views.hero_info)
]
注意:正则分组匹配的值可以当做视图函数的参数被引用。
6.创建模板
打开test1/settings.py文件,配置模板查找目录TEMPLATES的DIRS。
TEMPLATES = [
‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,
‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)],
‘APP_DIRS‘: True,
‘OPTIONS‘:
‘context_processors‘: [
‘django.template.context_processors.debug‘,
‘django.template.context_processors.request‘,
‘django.contrib.auth.context_processors.auth‘,
‘django.contrib.messages.context_processors.messages‘,
],
,
,
]
在templates/booktest/ 目录下创建index.html和heroInfo.html文件。
index.html模板代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书列表</title>
<style>
body background-color: #efefef;
td text-align: center;
</style>
</head>
<body>
<h1>title</h1>
<a href="/booktest/create">新增</a>
<table width="500px">
<tr>
<th>书籍名称</th>
<th>发布日期</th>
<th>阅读量</th>
<th>评论量</th>
<th>操作</th>
</tr>
%for book in books%
<tr>
<td>book.btitle</td>
<td>book.bpub_date</td>
<td>book.bread</td>
<td>book.bcomment</td>
<td>
<a href="/booktest/delete/book.id">删除</a>
<a href="/booktest/heroInfo/book.id">查看英雄</a>
</td>
</tr>
%endfor%
</table>
</body>
</html>
heroInfo.html模板代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>英雄信息</title>
</head>
<body>
<h1>title</h1>
% for hero in heros %
<li> hero.hname , hero.hgender , hero.hcomment </li>
% endfor %
</body>
</html>
7.运行
运行服务器。
python manage.py runserver
在浏览器中查看http://127.0.0.1:8000/booktest/
webapisdom-事件委托+综合案例(代码片段)
...数 / 事件基础 / 高阶函数 / 环境对象 / 综合案例-Tab栏切换 / DOM节点 /DOM时间对象/DOM重绘和回流/ DOM-事件对象/DOM-事件流目标:能够说出事件委托的好处一、事件委托是利用事件流的特征解决一些 查看详情
javaee框架技术之14ssm综合案例(代码片段)
SSM综合案例一、课程目标1.【掌握】SSM整合2.【√】学习Lombok使用3.【理解】Layui页面书写(备注:其他前端技术也可以)4.【理解】理解SSM综合案例表的结构5.【掌握】产品管理二、SSM整合Spring+SpringMVC+Mybatis–>SSMSpring+Struts2+Hiber... 查看详情
dom-节点对象+时间节点综合案例(代码片段)
...数 / 事件基础 / 高阶函数 / 环境对象 / 综合案例-Tab栏切换 / DOM节点 /DOM时间对象发布微博案例 需求11.注册input事件2.将文本的内容的长度赋值给对应的数值3.表单的maxlength属性可以直接限制在200个 查看详情
03ssm综合案例之16springsecurity(代码片段)
day03_SSM综合案例一、课程目标1.【理解】SpringSecurity权限框架2.【掌握】使用SpringSecurity进行用户登录3.【掌握】资源权限管理二、SpringSecurity2.1什么是SpringSecuritySpringSecurity的前身是AcegiSecurity,是Spring项目组中用来提供安全认... 查看详情
爬虫——综合案例流程版(代码片段)
爬虫综合案例开发步骤:导入类库创建爬虫通用类初始化init方法类中编写重试下载模块类中编写真正下载模块类外编写保存函数类外编写获取robots.txt函数类外编写抽取网址函数类中编写网址正常化函数创建下载限流类爬虫通用... 查看详情
mysql例题一综合案例(多条件组合查询)(代码片段)
MySQL例题一综合案例多条件组合查询练习易错知识点/*NULL和空值-NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符(’’)。selectlength(NULL),length(''),length('1'),length('2');+--------------+------------+- 查看详情
mysql例题一综合案例(多条件组合查询)(代码片段)
MySQL例题一综合案例多条件组合查询练习易错知识点/*NULL和空值-NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符(’’)。selectlength(NULL),length(''),length('1'),length('2');+--------------+------------+- 查看详情
2021年最新最全flink系列教程__flink综合案例(代码片段)
day09_综合案例今日目标FlinkFileSink落地写入到HDFSFlinkSQL整合Hive数据仓库订单自动好评综合案例FlinkFileSink落地写入到HDFS常用的文件存储格式TextFilecsvrcFileparquetorcsequenceFile支持流批一体的写入到HDFSFileSink需求将流数据写入到HDFSpackage... 查看详情
c语言文件读写综合案例:读取lol信息(代码片段)
文章目录文件读写综合案例读写配置文件config.txt出现问题:解决中文乱码代码文件读写综合案例读写配置文件配置文件格式如下:正式的数据以‘:’冒号进行分割:冒号前为key起到索引作用冒号后为value是实值。#开头的... 查看详情
c语言文件读写综合案例:读取lol信息(代码片段)
文章目录文件读写综合案例读写配置文件config.txt出现问题:解决中文乱码代码文件读写综合案例读写配置文件配置文件格式如下:正式的数据以‘:’冒号进行分割:冒号前为key起到索引作用冒号后为value是实值。#开头的... 查看详情
用户授权控制数据库远程维护综合应用案例(代码片段)
案例1:授权数据库用户案例2:查看及撤销授权案例3:重置数据库管理密码案例4:远程维护数据库案例5:企业OA系统部署案例6:企业OA系统迁移1案例1:授权数据库用户1.1问题本例要求掌握MariaDB数据库中用户账号的授权操作,... 查看详情
javase案例04——io流综合运用案例案例(代码片段)
1需求将以下的打乱顺序的出师表重新进行排序,并输出到另一个文件!一、先帝创业未半而中道崩殂,五、然侍卫之臣不懈于内,六、忠志之士忘身于外者,二、今天下三分,九、诚宜开张圣听三、益州疲弊,八、欲报之于陛下也,七... 查看详情
综合案例:使用express开发接口服务(代码片段)
目录参考:https://github.com/gothinkster/realworld1.创建项目mkdirrealworld-api-expresscdrealworld-api-expressnpminit-ynpmiexpressapp.jsprocess.env.PORT表示当前目录下环境变量port的值,可以在node启动时设置该值constexpress 查看详情
javaee框架技术之14ssm综合案例产品管理crud(代码片段)
SSM综合案例一、课程目标1.【掌握】SSM整合2.【√】学习Lombok使用3.【理解】Layui页面书写(备注:其他前端技术也可以)4.【理解】理解SSM综合案例表的结构5.【掌握】产品管理二、SSM整合Spring+SpringMVC+Mybatis–>SSMSpring+Struts2+Hiber... 查看详情
javaee框架技术之15ssm综合案例订单管理查询(代码片段)
day02_SSM综合案例一、课程目标1.【掌握】订单管理查询2.查询所有订单信息3.理解关系--mybatis;一对多一对一4.理解订单详情二、订单管理2.1查询所有订单2.1订单表关系结构图2.2创建相应的实体类//会员类@Data@AllArgsConstruct... 查看详情
awk从入门到入土(16)awk综合案例(代码片段)
准备好以下log,xxx@tegra-ubuntu:~$catlog(1658413180.629040)can0047C0003[8]DC28846851E405F6(1658413180.729148)can0047C0003[8]30B0856851E405F7 查看详情
javaee框架技术之17之ssm综合案例角色管理(代码片段)
day04_SSM综合案例一、课程目标1.【掌握】角色管理功能 要求:1.1框架必须掌握住; 1.2这次的使用来复习注解sql开发 1.3restful风格的实现,有能力的去尝试2.【掌握】用户管理功能二、角色管理2.1查询角色2.1.1RoleMapper接口@Select("sele... 查看详情
综合案例:使用express开发接口服务(续)(代码片段)
目录⑦用户登录开发1.获取请求体数据2.数据验证3.生成token4.发送成功响应(包含token的用户信息)基于JWT的身份验证 https://blog.csdn.net/YINZHE__/article/details/120080256config/config.default.js中的jwtSecret可以用UUID保证唯一性 http://www.uuid.online/... 查看详情