Django2.0+Bootstrap书籍管理系统

项目介绍

本篇书籍管理系统的主要功能是简易图书的添加,修改及删除。可作为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")
]

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)

大功告成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值