图书管理系统共分为两篇博客进行讲解,该篇博客主要记录图书与出版社之间的关系(一对一),记录图书的增删查改操作

==================================================

一、数据库设计

图书管理系统共分为三个角色:图书,出版社,作者

一本书  ========  一个出版社

一本书  ======== 多个作者

一个作者 ======= 多本书

出版社与书之间的关系:一对多的关系   =====》外键

书于作者之间的关系:多对多的关系 =====》用第三张表做关联

=================================================

二、代码部分(只记录代码部分,使用的一些其他操作,可以根据我以前的记录进行学习)

1.创建一个app04模块,作为图书管理系统模块;在系统中注册模板文件夹和静态文件夹

2.创建图书与出版社的模型类,models.py代码如下:

from django.db import models

# Create your models here.

class Publisher(models.Model):
"""
出版社模型类
"""
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=20) class Books(models.Model):
"""
图书模型类
"""
id=models.AutoField(primary_key=True)
bookname=models.CharField(max_length=24)
publisher=models.ForeignKey(to="Publisher")

通过两个命令在数据库中创建这两个类的表

3.查

3.1 views.py中代码如下:

def show_bookmanager(request):
"""
查询所有的图书记录
:param request:
:return:
"""
get_all_books=Books.objects.all() # 通过ORM进行查询所有的数据
return render(request,"allbooks.html",{"books":get_all_books})

3.2 项目同名文件夹下的url路径配置,urls.py中代码如下:

urlpatterns = [
url(r'^app04/',include('app04.urls')),
]

3.2 在app04模块下配置url路径,app04/urls.py中代码如下:

urlpatterns=[
url(r'^allbooks/$',show_bookmanager),
]

3.4 前端allbooks.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form>
<table border="1">
<tr>
<td>ID</td>
<td>book</td>
<td>publisher</td>
</tr>
{% for book in books %}
<tr>
<td>{{ book.id }}</td>
<td>{{ book.bookname }}</td>
<td>{{ book.publisher.title }}</td>
</tr>
{% endfor %} </table>
</form>
</body>
</html>

启动manage.py通过http://127.0.0.1:8000/app04/allbooks/就可以通过浏览器访问图书的所有信息了

通过上述查的例子已经能查出所有的图书信息了,那么下面的步骤基本上和上面一致,就直接进行代码记录,最后总结里面的相关知识点

4.增

4.1 app04/urls.py代码如下:

urlpatterns=[
url(r'^allbooks/$',show_bookmanager),
url(r'^addbook/$',add_bookmanager),
]

4.2 views.py代码如下:

def add_bookmanager(request):
"""
添加图书信息
:param request:
:return:
"""
# 如果是通过get方法进行请求的数据,查询所有的出版社,用于显示到添加界面,供用户进行选择出版社
if request.method=="GET":
all_publisher = Publisher.objects.all()
return render(request,"addbooks.html",{"publishers":all_publisher})
# 如果通过post方法进行请求的数据,获取前端传递过来图书名称、出版社名称,然后插入到数据库中
if request.method=="POST":
get_book=request.POST.get('txtbookname',None) # 获取前端传递过来的图书名称
get_pulisher=request.POST.get('selectpublisher',None) # 获取前端传递过来的出版社名称
a=Books.objects.create(bookname=get_book,publisher_id=get_pulisher) # 插入数据
return redirect("/app04/allbooks/") # 通过重定向,显示所有的数据

4.3 前端代码,在allbooks.html中添加一个跳转链接

<a href="/app04/addbook/">添加图书</a>

addbooks.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app04/addbook/" method="post">
<input type="text" name="txtbookname"/>&nbsp;
<select name="selectpublisher">
{% for p in publishers %}
<option value="{{ p.id }}">{{ p.title }}</option>
{% endfor %}
</select>
<input type="submit" value="添加"/>
</form>
</body>
</html>

5.删

5.1 app04/urls.py代码如下:

urlpatterns=[
url(r'^allbooks/$',show_bookmanager),
url(r'^addbook/$',add_bookmanager),
url(r'^delete/$',delete_bookmanager),
]

5.2 views.py代码如下:

def delete_bookmanager(request):
"""
删除图书信息
:param request:
:return:
"""
get_id=request.GET.get('id') # 获取前端传递过来的数据
if get_id: # 如果获取到了前端传递过来的数据,进行下一步
delete_book=Books.objects.get(id=get_id) # 通过id获取到对应的图书信息
delete_book.delete() # 删除对应的信息
return redirect("/app04/allbooks/")

5.3 前端allbooks.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form>
<a href="/app04/addbook/">添加图书</a>
<table border="1">
<tr>
<td>ID</td>
<td>book</td>
<td>publisher</td>
<td>operation1</td>
</tr>
{% for book in books %}
<tr>
<td>{{ book.id }}</td>
<td>{{ book.bookname }}</td>
<td>{{ book.publisher.title }}</td>
<td><a href="/app04/delete/?id={{ book.id }}">删除</a></td>
</tr>
{% endfor %} </table>
</form>
</body>
</html>

6.改

6.1 app04/urls.py代码如下:

urlpatterns=[
url(r'^allbooks/$',show_bookmanager),
url(r'^addbook/$',add_bookmanager),
url(r'^delete/$',delete_bookmanager),
url(r'^editor/$',editor_bookmanager),
]

6.2 views.py代码如下:

def editor_bookmanager(request):
"""修改图书信息"""
if request.method=="GET":
get_id=request.GET.get('id') # 获取前端传递过来参数为id的数据
if get_id:
get_book=Books.objects.get(id=get_id) # 根据id获取到对应的数据信息
get_publisher=Publisher.objects.all() # 查询出所有的出版社信息
return render(request,"editorbooks.html",{"book":get_book,"publishers":get_publisher})
else:
return redirect("/app04/allbooks/")
if request.method=="POST":
get_id=request.POST.get('updateid')
get_name=request.POST.get('updatename')
get_publisher=request.POST.get('selectpublisher')
# 以下四句代码都是进行修改数据的代码
editor_book=Books.objects.get(id=get_id)
editor_book.bookname=get_name
editor_book.publisher_id=get_publisher
editor_book.save()
return redirect("/app04/allbooks/")

6.3前端editorbooks.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app04/editor/" method="post">
<input type="text" name="updateid" value="{{ book.id }}" style="display: none;"/>
<input type="text" name="updatename" value="{{ book.bookname }}"/> <select name="selectpublisher">
{% for publisher in publishers %}
{% if book.publisher_id == publisher.id %}
<option selected value="{{ publisher.id }}" >{{ publisher.title }}</option>
{% else %}
<option value="{{ publisher.id }}">
{{ publisher.title }}
</option>
{% endif %}
{% endfor %}
</select>
<input type="submit" value="更新"/>
</form>
</body>
</html>

============================================

总结:

1.一对多关系

class Publisher(models.Model):
"""
出版社模型类
"""
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=20) class Books(models.Model):
"""
图书模型类
"""
id=models.AutoField(primary_key=True) # 表的id,AutoField是自动增长,相当于设置auto_increment
bookname=models.CharField(max_length=24) # 表的name,CharField是数据库中的varchar,max_length必须设置
publisher=models.ForeignKey(to="Publisher") # 表的外键,这是一对多关键的所在,to="Publisher"表示关联Publisher模型类的主键

一对多的关系,主要在于设置外键,在该例子中图书是多,出版社是一的关系。

2.增删查改

在该例子中,如果想对图书类进行操作,就相当于对Books类进行操作,具体如下:

查:Books.objects.all() 查询出所有的信息,相当于sql语句:select * from 图书表

  Books.objects.get(id=1) 查询出id=1的图书信息,相当于sql语句:select * from 图书表 where id=1;

增:Books.objects.create(bookname="高等数学") 添加bookname="高等数学"的图书信息,相当于sql语句:insert into 图书表 (bookname) values ('高等数学');

删:Books.objects.get(id=1).delete() 删除id=1的图书信息,详单与sql语句:delete from 图书表 where id=1

改:editor_book=Books.objects.get(id=1)

  editor_book.bookname="离散数学"

  editor_book.save()

  相当于sql语句:update 图书表set bookname="离散数学" where id=1;

3.request.GET.get('id',None)  表示获取get方法请求的参数,如果没有获取到,返回None,不会报错

 request.GET['id']  表示获取get方法请求的参数,如果没有获取到,会程序报错

同理:request.POSTget("id",None)和request.POST['id']的方法和上面介绍的方法类似,唯一的区别在于这两个方法是获取POST请求的参数

最新文章

  1. 解决xampp端口冲突
  2. ADO.NET防止字符串攻击方法
  3. Unity手游之路&lt;一&gt;C#版本Protobuf
  4. jquery之empty()方法详解
  5. javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
  6. Java Hour 50 日期类型
  7. Mybatis Generator(定制化)代码生成器
  8. WINRARA 排除 .svn 文件夹
  9. hdu 2711&amp;&amp;poj2182 Lost Cows (线段树)
  10. 模态运行EXE程序
  11. js星级评分点击星级评论打分效果--收藏--转载
  12. swift3.0 构造器、析构方法(3)
  13. java_软件发布版本_Asynch HttpClien 对比发行版本说明_Alpha、Beta、RC、GA版本的区别
  14. 关于java的Synchronized,你可能需要知道这些(下)
  15. HDFS配置参数及优化之实战经验(Linux hdfs)
  16. 64位程序,利用ADO连接Oracle数据库
  17. Django笔记(2)Json字段处理
  18. 使用commons-pool2实现FTP连接池
  19. Sql Server与.Net(C#)中星期值对比
  20. c++ remove_if

热门文章

  1. Mysql中判断是否存在
  2. layui之弹出层关闭和刷新问题
  3. IntelliJ IDEA如何导入jar包
  4. 转载:EQ--biquad filter
  5. Python记通用列表操作之切片!
  6. 前台后台$.psot交互
  7. git merge 将多个commit合并为一条之--squash 选项
  8. opencv:形态学操作-腐蚀与膨胀
  9. 10day 系统安全优化
  10. Linux - gitlab的命令