图书管理

书籍管理

book

name

项目源码位置:https://gitee.com/machangwei-8/learning_materials/tree/master/%E9%A1%B9%E7%9B%AE/bookmanager02

1、环境准备

下载bootstrap

引入到之前的网页:

将下面的网页

使用下面的模板 https://v3.bootcss.com/examples/dashboard/

起步->基本模板->控制台

刚刚我的复制过来有问题,settings配置静态文件目录配置错了,{},应该是[]。有文件但是没有渲染上,报错没找到文件,配置文件弄错了。

将源码放到自己的文件中。将下面不要的删除

下面的需要;

圆圈不需要删掉:

删掉:

下面只留一个li标签

现在删改并替换成这个样子了:

将右下角的变成面板:使用如下样式:

复制粘贴

将下面的放到面板中

格式化代码

给它们是三个设置成按钮

下面的地方修改一下:并且a标签的地址改正确

下面的新增也改变一下,用刚才那个面板

使用bootstrap

使用栅栏

选择下面的这个表单替换面板的内容:

复制过来修改form  post请求,加个name,

编辑页面也做一下,和添加页面差不多

2、外键设计

class Book(models.Model):
title = models.CharField(max_length=32)
pub = models.ForeignKey('Publisher', on_delete=models.CASCADE)

on_delete 在django2.0 版本之后是必填的参数 1.11 之前的可以不填

on_delete 的参数 models.CASCADE models.SET() models.SET_DEFAULT models.SET_NULL

一个出版社可以出版多本不同的书,一对多

on_delete是级联删除用的。一对多,外键在多,

级联   删一,多也删,删多,一不删;非级联删1多不删吧?

外键Publisher不加引号也可以,但是必须方法Publisher类后面,然后是未定义。而这里支持字符串,是使用反射的方法,book类在前在后都可以

on_delete 在django2.0 版本之后是必填的参数 1.11 之前的可以不填

on_delete 的参数 models.CASCADE models.SET() models.SET_DEFAULT models.SET_NULL

还可以设置默认值,设置为空等等

这里创建外键默认会在表中创建一个同名的加_id的字段。类中的这里代表的是外键的一行数据,一个对象

orm一个类中设置了一个外键的类变量,这个类变量是外键所在类的一个对象(即外键所在类的一行数据的对象)。而在定义外键的这个类中,定义外键的那个字段是“外键类变量_id”来表示。

既然这样,那我把models里字段改成pub。然后将刚刚的book删除

删除之后重新生成迁移文件,迁移的时候出了问题:

这是因为这里有之前的操作记录了,要删掉

然后再执行显示表存在,再次删掉这张表

修改成功:

可以直接复制粘贴

3、查询

all_books = models.Book.objects.all()

for book in all_books:

print(book.title)
print(book.pub,type(book.pub)) # ——> 所关联的出版社对象
print(book.pub.pk) # 查id 多一次查询
print(book.pub_id) # 直接在book表中查出的ID
print(book.pub.name)
print("*"*)

现在做一个book_list的页面

1)url,函数

2)函数render一个book_list.html

定义的外键是个对象,本表会加个_id(外键_id)作为本表的字段。引用外表的其它字段时,外键.外表字段

因此这里可以:

在本张表中,1和2的区别是1做了两次操作,先在本表拿到pub对象,再去另一张表中找到那张表的主键。而2只做了一次操作,所以2效率高

三种方法如下:

4、新增

models.Book.objects.create(title=book_name,pub=出版社的对象)
models.Book.objects.create(title=book_name,pub_id=pub_id)

新增逻辑如下;

这里没有东西:

数据表字段写错了报错:应该是title   :          'name' is an invalid keyword argument for this function

没获取到post传过来的值,赋值到数据库字段中是空的

添加书籍成功:

新建的这个对象,可以对象.字段进行取值了

5、删除

pk = request.GET.get('id')
models.Book.objects.filter(pk=pk).delete()

实现book_listt页面的删除按钮可以获取pk

函数编写:

我写的是小写book类名,数据库名字这里没有Book  #没有创建表的类或者类写错类名

成功删除第一条带有外键(出版社)的数据:

4处只匹配1,1后面有参数(2)是不用管的,在地址栏点击回车拼接出来的地址就能删除掉id是2的数据表记录 #地址栏做删除数据库操作,(如果用户有权限,那么数据库就可以被删数据)

删除流程:服务器返回/book_list/的get请求结果

6、编辑

{% if book_obj.pub == publisher %}
<option selected value="{{ publisher.pk }}"> {{ publisher.name }} </option>
{% else %}
<option value="{{ publisher.pk }}"> {{ publisher.name }} </option>
{% endif %}

1)url,函数先实现返回编辑页面

2)在book_list.html展示页中添加编辑按钮

3)创建edit_book.html,和添加页面差不多。

已经能拿到要编辑的pk,应该还要拿到要编辑的书名和出版社,以及其它可以通过下拉菜单做选择的其它选项

显示编辑的书名:

下拉选择菜单数据传进去:

使用下面语法添加判断,满足条件的做另外的操作:

     {% if edit_obj %}
{% else %}
{% endif %}

实现出版社默认显示要编辑的对象的:   判断从数据库拿到的每个出版社对象,如果==点击编辑的edit_obj这个对象,那么让它是被选中的

编辑的逻辑过程;

对象.字段=获取到的值  作为赋予新的值,就是编辑,点赋值需要save保存的,跟create创建有区别的。

外键的重新赋值如下两种方式:

7、修改数据,级联删除

book_obj.title = book_name
# book_obj.pub_id = pub_id
book_obj.pub = models.Publisher.objects.get(pk=pub_id)
book_obj.save()

修改数据示例在上面的6、编辑数据中

from django.shortcuts import render,redirect,HttpResponse
from app01 import models
#展示出版社
def publisher_list(request):
# 从数据库中查询到出版社的信息
all_publishers = models.Publisher.objects.all().order_by('pk')
return render(request, 'publisher_list.html', {'all_publishers': all_publishers}) #publisher_list.html中使用的是字典中的键,键代替这个所有的对象 def add_publisher(request):
error=''
#返回一个包含from表单的出版社页面
if request.method=='POST':
publish_name=request.POST.get('publisher_name')
# 判断出版社名称是否有重复的
if models.Publisher.objects.filter(name=publish_name):
error='出版社名称已存在'
#判断输入值是否为空
if not publish_name:
error="输入不能为空"
if not error:
obj=models.Publisher.objects.create(name=publish_name)
#跳转到展示出版社的页面
return redirect('/publisher_list/')
return render(request,'add_publisher.html',{'error':error}) def del_publisher(request):
# 获取要删除的数据
pk = request.GET.get('id')
obj_list = models.Publisher.objects.filter(pk=pk)
if not obj_list:
# 没有要删除的数据
return HttpResponse('要删除的数据不存在')
# 删除该数据
# obj.delete()
obj_list.delete()
# 跳转到展示页面
return redirect('/publisher_list/') def edit_publisher(request):
error = '' # 查找要编辑的数据
pk = request.GET.get('id') # url上携带的参数 不是GET请求提交参数
obj_list = models.Publisher.objects.filter(pk=pk)
if not obj_list:
return HttpResponse('要编辑的数据不存在')
obj = obj_list[]
if request.method == 'POST': # 处理POST请求
publisher_name = request.POST.get('publisher_name') # 获取新提交的出版的名称
if models.Publisher.objects.filter(name=publisher_name):
error = '新修改的名称已存在' # 新修改的名称已存在
if obj.name == publisher_name:
error = '名称未修改'
if not publisher_name:
error = '名称不能为空'
if not error:
obj.name = publisher_name # 修改数据
obj.save() # 保存数据到数据库中
# 跳转到出版社的展示页面
return redirect('/publisher_list/')
return render(request, 'edit_publisher.html', {'obj': obj,'error':error}) # 返回一个包含原始数据的页面 def book_list(request):
books=models.book.objects.all()
return render(request,'book_list.html',{'books':books}) def add_book(request):
if request.method=='POST':
new_name=request.POST.get('new_name')
pub_id=request.POST.get('pub')
models.book.objects.create(title=new_name,pub_id=pub_id) #或者pub=models.Publisher.objects.get('pub_id')
return redirect('/book_list/')
publishers=models.Publisher.objects.all()
return render(request,'add_book.html',{'publishers':publishers}) def del_book(request):
# 获取要删除的对象删除
pk = request.GET.get('pk')
models.book.objects.filter(pk=pk).delete() #删除要删除的对象
# 跳转到展示页面
return redirect('/book_list/') def edit_book(request):
pk=request.GET.get('pk')
edit_obj=models.book.objects.get(pk=pk)
if request.method == 'POST':
new_name=request.POST.get('new_name')
pub_id=request.POST.get('pub_id')
edit_obj.title=new_name
edit_obj.pub_id=pub_id
edit_obj.save()
return redirect('/book_list/')
publishers=models.Publisher.objects.all()
return render(request,'edit_book.html',{'edit_obj':edit_obj,'publishers':publishers})

views.py

将数据库修改之后报错:删掉1处,重新在新的数据库插入数据

修改连接的数据库

这里只是将断开连接点的数据库在pycharm上移除,而不是删除后台数据库

修改数据结构,再修改下代码,就改成学员管理系统

演示级联删除:

级联删除成功:一对多,删一,多中对应的都删

Django图书管理系统(前端对有外键的数据表增删改查)的更多相关文章

  1. Django之数据表增删改查

    Django数据增删改查: 上课代码 from django.shortcuts import render,HttpResponse # Create your views here. from a ...

  2. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  3. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  4. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  5. Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)

    Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...

  6. django学习-12.访问不同url/接口地址实现对指定数据的增删改查功能

    1.前言 通过前面博客[django学习-10.django连接mysql数据库和创建数据表]里的操作,我们已经成功在数据库[hongjingsheng_project]里创建了一张数据表[hello ...

  7. Django ORM 实现数据的多表 增删改查

    一.创建模型和表 假定下面这些概念.字段与关系: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,手机号,家庭住址信息. 作者详情模型 和 作者模型之间是一对一的关系(one- ...

  8. 在django中使用orm来操作MySQL数据库的建表,增删改

    多张表之间的三种关系:一对一,一对多,多对多 创建表 一对一 xx = models.OneToOneField(to='表明',to_field='字段名',on_delete=models.CAS ...

  9. python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查

    Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...

随机推荐

  1. vue的mixin简化开发

    vue的mixin可以将多个组件公用的声明周期方法和数据封装成一个对象,在不同的组件中自由插拔.实际做项目的时候,可以定义一些mixin,供多个组件使用.也非常有必要定义一个全局的mixin对象,对所 ...

  2. [LeetCode] 34. Search for a Range 搜索一个范围(Find First and Last Position of Element in Sorted Array)

    原题目:Search for a Range, 现在题目改为: 34. Find First and Last Position of Element in Sorted Array Given an ...

  3. [LeetCode] 237. Delete Node in a Linked List 删除链表的节点

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  4. pytest+allure测试框架搭建

    https://blog.csdn.net/wust_lh/article/details/86685912 https://www.jianshu.com/p/9673b2aeb0d3 定制化展示数 ...

  5. docker+k8s基础篇三

    Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...

  6. Apache软件基金会核心项目Tomcat的那些事

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.今天就来为大家介绍一下关于T ...

  7. 【转帖】MIPS构架之:我和龙芯有个约会

    MIPS构架之:我和龙芯有个约会 https://www.eefocus.com/mcu-dsp/364490 <处理器史话>之十二 2016-06-24 12:21 作者:付丽华预计 1 ...

  8. [转帖]GNU, Free Software and Open Source 自由软件与开源软件

    GNU, Free Software and Open Source 自由软件与开源软件 https://blog.csdn.net/icycolawater/article/details/7792 ...

  9. NumPy基础操作(2)

    NumPy基础操作(2) (注:记得在文件开头导入import numpy as np) 目录: 写在前面 转置和轴对换 NumPy常用函数 写在前面 本篇博文主要讲解了普通转置array.T.轴对换 ...

  10. python实战项目 — selenium登陆豆瓣

    利用selenium 模仿浏览器,登陆豆瓣 重点: 1. 要设置好 chromedriver配置与使用, chromedriver.exe 和 Chrome的浏览器版本要对应, http://chro ...