Django实现一个简单的图书管理系统

Django用起来真的很方便
我用的是Pycharm 2019.3.4 专业版,直接新建一个Django项目
数据库我用的是mysql

效果

增删查都有了
查:
首页查看图书列表
在这里插入图片描述
增:
在这里插入图片描述
删:
在这里插入图片描述
点击首页的图书名,可以跳转到详情页,然后可以删除图书

删除后的效果
在这里插入图片描述

目录结构

目录结构如下
在这里插入图片描述

表结构

CREATE TABLE `book` (
  `id` int(125) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `author` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

在这里插入图片描述
id是自增主键

实现

比较麻烦的地方就是删除,其他还好
连接数据库分为两步

  1. 在settings.py文件中的DATABASES里面写上自己的配置
  2. 在__init__.py文件中写上
    import pymysql
    pymysql.install_as_MySQLdb()
    

项目里面有一个名为front的app,代码都写在这里

核心逻辑

全写在views.py文件中了,逻辑请看注释

from django.shortcuts import render,redirect,reverse
from django.db import connection

def get_cursor():
	#获得数据库的cursor
    return connection.cursor()

def index(request):
	'''
	首页 需要展示所有的书籍
	首页模板为index.html,传递获取到的books给该网页处理
	'''
    cursor=get_cursor()
    cursor.execute("select id,name,author from book")
    books=cursor.fetchall() # [(1,'name','author'),(...),...]
    return render(request,'index.html',context={"books":books})

def add_book(request):
	'''
	增加图书
	如果是get请求,返回add_book.html
	如果是post,则响应添加图书请求,使用get获取到post的参数,如书名,作者,然后执行SQL语句添加到数据库里面
	添加完之后我们跳转回首页
	'''
    if request.method=='GET':
        return render(request,'add_book.html')
    else:
        cursor=get_cursor()
        name=request.POST.get("name")
        author=request.POST.get("author")
        cursor.execute("insert into book(id,name,author) values(null,'%s','%s')"% (name,author))
        return redirect(reverse('index'))

def book_detail(request,book_id):
	'''
	书籍详情
	我们先从DB获取该图书的信息,然后返回一个book_detail页面
	'''
    cursor=get_cursor()
    cursor.execute("select id,name,author from book where id=%s"%book_id)
    book=cursor.fetchone()
    return render(request,'book_datail.html',context={'book':book})

def delete_book(request):
	'''
	实现删除功能
	删除的话我们接受POST请求,然后从POST里面获取id,接着执行SQL语句删除该条图书
	由于没有独立的delete_book.html,所以直接进入/delete_book/是错误的操作,这里我们让它默认跳转回首页
	'''
    if request.method=='POST':
        book_id=request.POST.get('book_id')
        cursor=get_cursor()
        cursor.execute("delete from book where id=%s" % book_id)
        return redirect(reverse('index'))
    else:
        # raise RuntimeError("删除图书失败")
        return redirect(reverse('index'))

urls.py文件内容如下

from django.urls import path
from front import views
urlpatterns = [
    path('',views.index,name='index'),	#首页
    path('add_book/',views.add_book,name='add_book'),	#添加图书
    path('book_detail/<int:book_id>',views.book_detail,name='book_detail'),	#书籍详情,以图书的id来作为区分
    path('delete_book/',views.delete_book,name='delete_book')	#删除图书
]

html和css

写得很简单
需要注意的是css存放在static文件中下面,所以要配置一下
添加上front
在这里插入图片描述
base.html模板

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图书管理系统</title>
    <link rel="stylesheet" href="{% static 'front/base.css' %}">
</head>
<body>
<nav>
    <ul class="nav">
        <li><a href="/">首页</a></li>
        <li><a href="{% url 'add_book' %}">发布图书</a></li>
    </ul>
</nav>
{% block content %}
{% endblock %}
</body>
</html>

首页只需要展示DB里面的数据就行了
index.html

{% extends 'base.html' %}
{% block content %}
    <div style="margin: 20px">
    <table>
        <thead>
        <tr>
            <th>序号</th>
            <th>书名</th>
            <th>作者</th>
        </tr>
        </thead>
        <tbody>
        {% for book in books %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td><a href="{% url 'book_detail' book_id=book.0 %}">{{ book.1 }} </a></td>
                <td>{{ book.2 }}</td>
            </tr>
        {% endfor %}

        </tbody>
    </table>
    </div>
{% endblock %}

add_book里面需要提交一个form表单,我们直接提交到当前页面就好,让它跳转回首页
add_book.html

{% extends 'base.html' %}
{% block content %}
    <form action="" method="post">
        <table>
            <tr>
                <td>书名:</td>
                <td><input type="text" name="name"></td>
            </tr>
            <tr>
                <td>作者:</td>
                <td><input type="text" name="author"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" name="submit"></td>
            </tr>
        </table>
    </form>
{% endblock %}

书籍详情,这里有删除图书的功能
也是提交一个form表单,交给delete_book处理
book_detail.html

{% extends 'base.html' %}
{% block content %}
    <p>书名:{{book.1 }}</p>
    <p>作者:{{ book.2 }}</p>
    <form action="{% url 'delete_book' %}" method="post">
        <input type="hidden" name="book_id" value="{{ book.0 }}">
        <input type="submit" value="删除图书">
    </form>
{% endblock %}

css文件

*{
    margin: 0;
    padding: 0;
}
.nav {
    background: #3a3a3a;
    height: 65px;
    overflow: hidden;
}

.nav li {
    float: left;
    list-style: none;
    margin: 0 20px;
    line-height: 65px;
}

.nav li a {
    color: #fff;
    text-decoration: none;
}

.nav li a:hover{
    color: lightblue;
}

  • 9
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值