Django之图书管理系统
一、创建项目文件夹
选择位置创建文件夹,在cmd中输入以下命令创建项目
django-admin startproject bookproject
点击创建的文件夹后再次cmd输入:
python manage.py startapp app01
二、打开python软件,配置
1、settings(其他配置跟以往相同)只需添加以下代码
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "bookshop",#数据名
"USER":"root",#用户名
"PASSWORD":"root",
"HOST":"",#域名
"PORT":"3306",#端口号
}
}
注:配置完成后手动添加文件夹static和template
2.配置models
#创建出版社对象
class Publisher(models.Model):
id = models.AutoField(primary_key = True)
name = models.CharField(max_length=64,null=False)
address = models.CharField(max_length=64,null=False)
#创建图书
class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5,decimal_places=2,default=10.01)
inventory = models.IntegerField(verbose_name='库存数')
sale_num = models.IntegerField(verbose_name='卖出数')
publisher = models.ForeignKey(to='Publisher', on_delete=models.CASCADE)
#创建作者列表
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
book = models.ManyToManyField(to='Book')
三、迁移数据库并写入数据库,启动项目
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
四、创建路由
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
#path('admin/', admin.site.urls),
#添加出版社路由
path('add_publisher/',views.add_publisher),
# 出版社路由列表
path('publisher_list/',views.publisher_list),
# 修改出版社路由
path('edit_publisher/',views.edit_publisher),
# 图书列表路由
path('book_list/',views.book_list),
# 添加图书路由
path('add_book/',views.add_book),
# 修改路由
path('edit_book/',views.edit_book),
# 删除图书路由
path('delete_book/',views.delete_book),
# 删除出版社路由
path('delete_publisher/',views.delete_publisher),
# 作者列表路由
path('author_list/',views.author_list),
# 添加作者路由
path('add_author/',views.add_author),
# 修改作者路由
path('edit_author/',views.edit_author),
# 删除作者路由
path('delete_author/',views.delete_author),
]
五、新建HTML页
六、写入views视图代码
首先导入redirect和models 模块
1.出版社
from django.shortcuts import render, redirect
from app01 import models
# Create your views here.
#添加出版社
def add_publisher(request):
if request.method == "POST":
# 获取表单提交的内容
publisher_name = request.POST.get('name')
publisher_address = request.POST.get('address')
# 保存数据库表单中
models.Publisher.objects.create(name=publisher_name, address=publisher_address).save()
return redirect('/app01/publisher_list/')
return render(request, 'add_publisher.html')
# 删除出版社
def delete_publisher(request):
# 获取删除图书的ID
id = request.GET.get('id')
# 根据ID删除数据库中的记录
models.Publisher.objects.filter(id=id).delete()
return redirect('/app01/publisher_list/')
#出版社列表
def publisher_list(request):
# get
# 查询数据库中所有信息
publisher_list = models.Publisher.objects.all()
return render(request, 'publisher_list.html', locals())
#修改出版社
def edit_publisher(request):
if request.method == 'POST':
# 获取表单提交过来的内容
id = request.POST.get('id')
name = request.POST.get('name')
address = request.POST.get('address')
# 根据ID去数据库中查找对象
publisher_obj = models.Publisher.objects.get(id=id)
# 修改
publisher_obj.name = name
publisher_obj.address = address
publisher_obj.save()
return redirect('/app01/publisher_list/')
else:
# 获取ID
id = request.GET.get('id')
# 去数据库中查找相应的数据
publisher_obj = models.Publisher.objects.get(id=id)
publisher_obj_list = models.Publisher.objects.all()
# 3返回页面
return render(request, 'edit_publisher.html',
{"publisher_obj": publisher_obj, "publisher_obj_list": publisher_obj_list})
![添加(https://img-blog.csdnimg.cn/20210413143704864.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDgxMjI1Mg==,size_16,color_FFFFFF,t_70)
2、图书
# 图书列表
def book_list(request):
# 获取图书信息
book_obj_list = models.Book.objects.all()
print(book_obj_list)
# 将数据放到页面上
return render(request, 'book_list.html', {"book_obj_list": book_obj_list})
#添加图书
def add_book(request):
if request.method == 'POST':
# 获取表单提交过来的内容
name = request.POST.get('name')
price = request.POST.get('price')
inventory = request.POST.get('inventory')
sale_num = request.POST.get('sale_num')
publisher_id = request.POST.get('publisher_id')
print(publisher_id)
# 保存到数据库app01book
models.Book.objects.create(name=name, price=price, inventory=inventory, sale_num=sale_num,
publisher_id=publisher_id).save()
# 重定向到图书列表页面
return redirect('/app01/book_list/')
else:
# 获取所有出版社
publisher_obj_list = models.Publisher.objects.all()
return render(request, 'add_book.html', {"publisher_obj_list": publisher_obj_list})
# 修改图书
def edit_book(request):
if request.method == 'GET':
# 获取ID
id = request.GET.get('id')
# 去数据库中查找相应的数据
book_obj = models.Book.objects.filter(id=id).first()
# 查找所有出版社
publisher_list = models.Publisher.objects.all()
# 返回页面
return render(request, 'edit_book.html',
{'book_obj': book_obj, 'publisher_list': publisher_list})
else:
# 获取表单提交过来的内容
id = request.POST.get('id')
name = request.POST.get('name')
inventory = request.POST.get('inventory')
sale_num = request.POST.get('sale_num')
price = request.POST.get('price')
publisher_id = request.POST.get('publisher_id')
# 查询数据库并进行更新
models.Book.objects.filter(id=id).update(name=name, price=price, inventory=inventory, sale_num=sale_num,
publisher_id=publisher_id)
# 定向到book_list中
return redirect('/app01/book_list/')
# 删除图书
def delete_book(request):
# 获取ID
id = request.GET.get('id')
# 删除图书
models.Book.objects.filter(id=id).delete()
# 重定向到图书列表
return redirect('/app01/book_list/')
# 删除图书管理
def delete_publisher(request):
# 获取删除图书的ID
id = request.GET.get('id')
# 根据ID删除数据库中的列表
models.Publisher.objects.filter(id=id).delete()
# 重定向
return redirect('/app01/publisher_list')
3、作者
# 添加作者
def add_author(request):
if request.method == 'GET':
# 1获取所有的图书
book_obj_list = models.Book.objects.all()
# 2返回页面
return render(request, 'add_author.html', {'book_obj_list': book_obj_list})
else:
# 1.获取表单提交过来的数据
name = request.POST.get('name')
book_ids = request.POST.getlist('books')
# 2 保存数据库
author_obj = models.Author.objects.create(name=name) # 创建对象
author_obj.book.set(book_ids) # 设置关系
# 3 重定向到列表页面
return redirect('/app01/author_list/')
# 删除作者
def delete_author(request):
# 获取id
id = request.GET.get('id')
# 删除作者
models.Author.objects.filter(id=id).delete()
# 重定向
return redirect('/app01/author_list/')
# 修改作者
def edit_author(request):
if request.method == 'GET':
# 获取id
id = request.GET.get('id')
# 查询对象和所有的图书
author_obj = models.Author.objects.get(id=id)
book_obj_list = models.Book.objects.all()
# 返回页面
return render(request, 'edit_author.html',
{'author_obj': author_obj, 'book_obj_list': book_obj_list})
else:
# 保存修改的数据
# 获取表单提交过来的内容
id = request.POST.get('id')
name = request.POST.get('name')
book_ids = request.POST.getlist('books')
# 根据id查找对象并修改
author_obj = models.Author.objects.filter(id=id).first()
author_obj.name = name
author_obj.book.set(book_ids)
author_obj.save()
# 重定向到作者列表
return redirect('/app01/author_list/')
七、编写HTML页面
首先写入母板,其他网页都调用其母板
(母板)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>图书管理系统</title>
<!-- Bootstrap -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
<!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
<!--[if lt IE 9]>
<script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!--分页名称-->
<h1 class="text-center">图书管理系统</h1>
<!--这是导航栏-->
{% include "nav.html" %}
<!--这是侧栏-->
<div class="container-fluid">
<div class="row">
<div class="col-md-3">
<ul class="nav nav-sidebar">
{% block nav %}
{% endblock %}
</ul>
</div>
<!--标题栏-->
{% block bar %}
{% endblock %}
<!--主程序-->
{% block main%}
{% endblock %}
<!--这是页码-->
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
</body>
</html>
(导航栏)
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/app01/book_list/">首页</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="/app01/book_list/">图书列表<span class="sr-only">(current)</span></a></li>
<li class="active"><a href="/app01/author_list/">作者列表</a></li>
<li class="active"><a href="/app01/publisher_list/">出版社列表</a></li>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-left">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search">
</div>
<button type="#" class="btn btn-default">Submit</button>
</form>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">Link</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
(1、图书列表)
{% extends "base.html" %}
{% block bar %}
<div class="col-md-9" style="justify-content: flex-end;">
<h1 class="page-header">出版社管理页面</h1>
<div class="panel panel-primary">
<div class="panel-heading">出版社列表 <i class="fa fa-thumb-tack pull-right"></i></div>
<div class="panel-body">
<div class="row" style="margin-bottom: 15px">
<div class="col-md-4">
<div class="input-group">
<input type="text" class="form-control" placeholder="Search for...">
<span class="input-group-btn">
<button class="btn btn-default" type="button">搜索</button>
</span>
</div>
</div>
<div class="col-md-2 pull-right">
<a class="btn btn-success" href="/app01/add_publisher">新增出版社</a>
</div>
</div>
</div>
{% endblock %}
{% block main%}
<table border="1" class="table table-hover table-bordered">
<thead>
<tr>
<th>序号</th>
<th>出版社</th>
<th>名称</th>
<th>地址</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for publisher_obj in publisher_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ publisher_obj.id }}</td>
<td>{{ publisher_obj.name }}</td>
<td>{{ publisher_obj.address }}</td>
<td>
<a href="/app01/edit_publisher/?id={{ publisher_obj.id }}">修改</a>
<a href="/app01/delete_publisher/?id={{ publisher_obj.id }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
(修改图书)
{% extends "base.html" %}
{% block bar %}
<div class="col-md-9" style="justify-content:flex-end ">
<h1 class="page-header">出版社管理页面</h1>
<div class="panel panel-primary">
<div class="panel-heading">修改出版社<i class="fa fa-thumb-tack pull-right"></i></div>
<div class="panel-body">
<div class="row" style="margin-bottom: 15px">
<div class="col-md-4">
<div class="input-group">
</div> <!-
</div> <!- /input-group -- >
</div>
</div>
</div>
{% endblock %}
{% block main %}
<form action="" method="post">
<p>
<input type="hidden" name="id" value="{{ publisher_obj.id }}">
</p>
<p>
出版社名称:<input type="text" name="name" value="{{ publisher_obj.name }}">
</p>
<p>
出版社地址:<input type="text" name="address" value="{{ publisher_obj.address }}">
</p>
<p>
<button type="submit" class="btn">提交</button>
</p>
</form>
{% endblock %}
(添加图书)
{% extends "base.html" %}
{% block bar %}
<div class="col-md-9" style="justify-content: flex-end;">
<h1 class="page-header">出版社管理页</h1>
<div class="panel panel-primary">
<div class="panel-heading">添加出版社 <i class="fa fa-thumb-tack pull-right"></i></div>
<div class="panel-body">
<!-
</div>
</div>
{% endblock %}
{% block main %}
<form action="" method="post">
{% csrf_token %}
<p>
出版社名称 <input type="text" name="name">
</p>
<p>
出版社地址 <input type="text" name="address">
</p>
<p>
<button type="submit" class="btn">提交</button>
</p>
</form>
</body>
</html>
{% endblock %}
(2、添加作者)
{% extends "base.html" %}
{% block bar %}
<div class="col-md-9" style="justify-content: flex-end;">
<h1 class="page-header">作者管理页面</h1>
<div class="panel panel-primary">
<div class="panel-heading">添加作者 <i class="fa fa-thumb-tack pull-right"></i></div>
<div class="panel-body">
<div class="row" style="margin-bottom: 15px">
<div class="col-md-4">
<div class="input-group">
</div> <!-
</div>
</div>
</div>
</div>
{% endblock %}
{% block main %}
<form action="" method="post">
{% csrf_token %}
<p>
作者 <input type="text" name="name">
</p>
<p>
书名
<select multiple name="books" >
{% for book_obj in book_obj_list %}
<option value="{{ book_obj.id }}">{{ book_obj.name }}</option>
{% endfor %}
</select>
</p>
<p>
<button type="submit" class="btn">提交</button>
</p>
</form>
{% endblock %}
(修改作者)
{% extends "base.html" %}
{% block bar %}
<div class="col-md-9" style="justify-content: flex-end;">
<h1 class="page-header">作者管理页面</h1>
<div class="panel panel-primary">
<div class="panel-heading">编辑作者 <i class="fa fa-thumb-tack pull-right"></i></div>
<div class="panel-body">
<div class="row" style="margin-bottom: 15px">
<div class="col-md-4">
<div class="input-group">
</div>
<!-
</div>
</div>
</div>
</div>
{% endblock %}
{% block main %}
<form action="" method="post">
{% csrf_token %}
<p>
<input type="hidden" name="id" value="{{ author_obj.id }}">
</p>
<p>
作者 <input type="text" name="name" value="{{ author_obj.name }}">
</p>
<p>
书名
<select name="books" id="books">
{% for book_obj in book_obj_list %}
<option value="{{ book_obj.id }}">{{ book_obj.name }}</option>
{% endfor %}
</select>
</p>
<p>
<button type="submit" class="btn">提交</button>
</p>
</form>
{% endblock %}
(3、添加图书)
{% extends "base.html" %}
{% block bar %}
<div class="col-md-9" style="justify-content: flex-end;">
<h1 class="page-header">图书管理页面</h1>
<div class="panel panel-primary">
<div class="panel-heading">添加图书 <i class="fa fa-thumb-tack pull-right"></i></div>
<div class="panel-body">
<!-
</div>
</div>
{% endblock %}
{% block main %}
<form action="" method="post">
{% csrf_token %}
<p>
图书名称 <input type="text" name="name">
</p>
<p>
价格 <input type="text" name="price">
</p>
<p>
库存 <input type="inventory" name="inventory">
</p>
<p>
卖出数 <input type="sale_num" name="sale_num">
</p>
<p>
出版社
<select multiple name="publisher_id" id="">
{% for publisher_obj in publisher_obj_list %}
<option value="{{ publisher_obj.id }}">{{ publisher_obj.name }}</option>
{% endfor %}
</select>
</p>
<p>
<button type="submit" class="btn">提交</button>
</p>
</form>
{% endblock %}
(修改图书)
{% extends "base.html" %}
{% block bar %}
<div class="col-md-9" style="justify-content:flex-end ">
<h1 class="page-header">出版社管理页面</h1>
<div class="panel panel-primary">
<div class="panel-heading">修改出版社<i class="fa fa-thumb-tack pull-right"></i></div>
<div class="panel-body">
<div class="row" style="margin-bottom: 15px">
<div class="col-md-4">
<div class="input-group">
</div> <!-
</div> <!- /input-group -- >
</div>
</div>
</div>
{% endblock %}
{% block main %}
<form action="" method="post">
{% csrf_token %}
<p>
<input type="hidden" name="id" value="{{ book_obj.id }}">
</p>
<p>
图书名称 <input type="text" name="name" value="{{ book_obj.name }}">
</p>
<p>
价格 <input type="text" name="price" value="{{ book_obj.price }}">
</p>
<p>
库存 <input type="invevtory" name="inventory" value="{{ book_obj.inventory}}">
</p>
<p>
卖出数 <input type="sale_num" name="sale_num"value="{{ book_obj.sale_num }}">
</p>
<p>
出版社 <input type="text" name="publisher_id" value="{{ book_obj.publisher.id }}">
</p>
<p>
<button type="submit" class="btn">提交</button>
</p>
</form>
{% endblock %}
(图书列表)
{% extends "base.html" %}
{% block bar %}
<div class="col-md-9" style="justify-content: flex-end;">
<h1 class="page-header">出版社管理页面</h1>
<div class="panel panel-primary">
<div class="panel-heading">出版社列表 <i class="fa fa-thumb-tack pull-right"></i></div>
<div class="panel-body">
<div class="row" style="margin-bottom: 15px">
<div class="col-md-4">
<div class="input-group">
<input type="text" class="form-control" placeholder="Search for...">
<span class="input-group-btn">
<button class="btn btn-default" type="button">搜索</button>
</span>
</div>
</div>
<div class="col-md-2 pull-right">
<a class="btn btn-success" href="/app01/add_publisher">新增出版社</a>
</div>
</div>
</div>
{% endblock %}
{% block main%}
<div class="container-fluid">
<div class="row-fluid">
<div class="span12">
<table border="1" class="table table-hover table-bordered">
<thead>
<tr>
<th>序号</th>
<th>图书ID</th>
<th>图书名</th>
<th>价格</th>
<th>库存</th>
<th>卖出数</th>
<th>出版社</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for book_obj in book_obj_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ book_obj.id }}</td>
<td>{{ book_obj.name }}</td>
<td>{{ book_obj.price }}</td>
<td>{{ book_obj.inventory }}</td>
<td>{{ book_obj.sale_num }}</td>
<td>{{ book_obj.publiser.name }}</td>
<td>
<a href="/app01/edit_book/?id={{ book_obj.id }}">修改</a>
<a href="/app01/delete_book/?id={{ book_obj.id }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% endblock %}
总结:创建django项目修改文件内容时需迁移数据库并写入数据库,定义变量注意调用准确,书写规范等。