项目介绍
本篇书籍管理系统的主要功能是简易图书的添加,修改及删除。可作为Django入门者的学习教程。如有错误或者建议,还望多多指教。书籍列表的页面如下:
源码链接:下载
技术工具:
Python3.6+Django2.0.6+Bootstrap4+SQLite
1.环境搭建
下载安装好Python后安装Django
pip3 install django==2.0.6
安装完成cd到相应目录,创建django项目mysite
django-admin startproject mysite
这时候名称为mysite的Django项目就搭建完成了
用Pycharm打开mysite项目
在命令行输入启动Django项目的命令
python3 manage.py runserver
这时候会出现Django安装成功的提示页面就表示我们的环境搭建顺利完成。
2. Setting和URL路由
- 修改setting文件, 更改语言和时区
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
- 创建lib应用, 在命令行输入
python3 manage.py startapp lib
- 在mysite/urls文件中添加lib路径代码,告诉urls当遇到lib/路径时,跳转到lib应用下的urls寻找视图函数。
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('lib/', include('lib.urls'))
]
- 在mysite/lib/urls如下代码, 包含了我们后面要写的书籍列表detail, 添加书籍addBook,删除书籍delBook还有编辑书籍editBook.
from django.urls import path
from . import views
app_name = 'lib'
urlpatterns = [
path('detail/', views.detail, name='detail'),
path('addBook/', views.addBook, name='addBook'),
path('delBook/<int:book_id>', views.delBook, name='delBook'),
path('editBook/<int:book_id>', views.editBook, name='editBook'),
]
3. 模型
在我们创建的图书应用中,需要创建一个模型Book。Book模型包括四个字段:书名、作者、出版社、发布日期。
在mysite/lib/models.py中输入如下代码
from django.db import models
# Create your models here.
class Book(models.Model):
name = models.CharField(max_length=200)
author = models.CharField(max_length=100)
pub_house = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
激活模型。在命令行中输入如下代码激活模型生成到数据库中。
python3 manage.py makemigrations
python3 manage.py migrate
这样我们的数据模型变生成在了数据库中。
4.模板
在新建模板之前先在项目的根目录下创建static文件夹,用来存放静态文件,因为我们的网站比较简单,所以静态文件主要为bootstrap4的静态组件,链接Bootstrap4下载链接,并且不要忘记在settings中设置静态目录路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
在lib应用下,新建templates文件夹,在templates文件夹下创建lib文件夹,然后在lib/templates/lib下新建三个html文档。
接下来便是写三个静态文件,很简单,具体代码如下,主要运用的是bootstrap样式,具体的同学们也可以从bootstrap4菜鸟教程里面获得启发
- detail.html 书籍列表
{% load staticfiles %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css">
<script src="{% static 'js/bootstrap.min.js' %}"></script>
<title>书籍列表</title>
</head>
<body>
<nav class="navbar navbar-expand-sm bg-success navbar-dark">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">图书管理系统</a>
</li>
</ul>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-2 bg-light">
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link" href="#">书籍列表</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">作者列表</a>
</li>
</ul>
</div>
<div class="col-sm-10">
<h1 class="text-center">书籍列表</h1>
<div class="row">
<div class="input-group col-sm-5 offset-7 mb-3">
<input type="text" class="form-control" placeholder="Search">
<div class="input-group-append">
<button class="btn btn-success" type="submit">Go</button>
</div>
</div>
</div>
<table class="table table-bordered">
<thead class="thead-light">
<tr>
<th>书名</th>
<th>作者</th>
<th>出版社</th>
<th>出版时间</th>
<th>操作</th>
</tr>
</thead>
{% for book in book_list.all %}
<tbody>
<tr>
<td>{{ book.name }}</td>
<td>{{ book.author }}</td>
<td>{{ book.pub_house }}</td>
<td>{{ book.pub_date }}</td>
<td>
<a class="btn btn-success" href="{% url 'lib:editBook' book.id %}">编辑</a>
<a class="btn btn-danger" href="{% url 'lib:delBook' book.id %}">删除</a>
</td>
</tr>
</tbody>
{% endfor %}
</table>
<a class="btn btn-primary" href="{% url 'lib:addBook' %}">添加书籍</a>
</div>
</div>
</div>
</body>
</html>
- addbook.html 添加书籍
{% load staticfiles %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css">
<script src="{% static 'js/bootstrap.min.js' %}"></script>
<title>添加书籍</title>
</head>
<body>
<h1 class="text-center">添加书籍</h1>
<div class="container">
<form action="" method="post" name="addBook">
{% csrf_token %}
<div class="form-group">
<label>书名</label>
<input type="text" class="form-control" name="name" placeholder="书名">
</div>
<div class="form-group">
<label>作者</label>
<input type="text" class="form-control" name="author" placeholder="作者">
</div>
<div class="form-group">
<label>出版社</label>
<input type="text" class="form-control" name="pub_house" placeholder="出版社">
</div>
<input class="btn btn-success" type="submit" value="添加">
</form>
</div>
</body>
</html>
- editbook.html 编辑书籍
{% load staticfiles %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css">
<script src="{% static 'js/bootstrap.min.js' %}"></script>
<title>编辑书籍</title>
</head>
<body>
<h1 class="text-center">编辑书籍</h1>
<div class="container">
<form action="" method="post" name="editBook">
{% csrf_token %}
<div class="form-group">
<label>书名</label>
<input type="text" class="form-control" value="{{ bookID_obj.name }}" name="name" placeholder="书名">
</div>
<div class="form-group">
<label>作者</label>
<input type="text" class="form-control" value="{{ bookID_obj.author }}" name="author" placeholder="作者">
</div>
<div class="form-group">
<label>出版社</label>
<input type="text" class="form-control" value="{{ bookID_obj.pub_house }}" name="pub_house" placeholder="出版社">
</div>
<input class="btn btn-success" type="submit" value="提交">
</form>
</div>
</body>
</html>
5. 视图
视图部分主要实现四个功能,一是书籍列表的展示,二是书籍的添加,三是书籍的删除以及最后书籍的修改。所以我会在lib/views.py里写四个函数
- 书籍列表
def detail(request):
book_list = Book.objects.order_by('-pub_date')
context = {'book_list': book_list}
return render(request, 'lib/detail.html', context)
在此视图函数detail中,首先将数据库的Book列表按照pub_date时间来排序,存储到变量book_list中。Django 提供了一个快捷函数render()。
render()函数把request对象作为它的第一个参数,模板作为第二个参数,字典作为它的可选的第三个参数。它返回给定模板呈现的给定文本的一个HttpResponse对象。在这里,context信息将会返回到模板lib/detail.html。
- 添加书籍
def addBook(request):
if request.method == 'POST':
name = request.POST['name']
author = request.POST['author']
pub_house = request.POST['pub_house']
temp_book = Book(name=name, author=author, pub_house=pub_house, pub_date=timezone.now())
temp_book.save()
return HttpResponseRedirect(reverse('lib:detail'))
else:
return render(request, 'lib/addbook.html')
request.POST 是一个类字典对象,可以通过关键字的名字获取提交的数据。 这个例子中,request.POST[‘name’] 以字符串形式返回name的值。 request.POST 的值永远是字符串
- 删除书籍
def delBook(request, book_id):
bookID = book_id
Book.objects.filter(id=bookID).delete()
return HttpResponseRedirect(reverse('lib:detail'))
可以看出,只需要在每个书籍后面添加一个删除的按钮。删除时也传递了需要删除的图书的id。
- 编辑书籍
def editBook(request, book_id):
bookID = book_id
bookID_obj = Book.objects.get(id=bookID)
temp_book = Book.objects.filter(id=bookID)
context = {'bookID_obj': bookID_obj}
if request.method == 'POST':
name = request.POST['name']
author = request.POST['author']
pub_house = request.POST['pub_house']
temp_book.update(name=name, author=author, pub_house=pub_house, pub_date=timezone.now())
return HttpResponseRedirect(reverse('lib:detail'))
else:
return render(request, 'lib/editbook.html', context)
大功告成!