Django 简单图书管理系统

news2024/12/22 19:41:48

一、图书需求

1. 书籍book_index.html中有超链接:查看所有的书籍列表book_list.html页面
2. 书籍book_list.html中显示所有的书名,有超链接:查看本书籍详情book_detail.html(通过书籍ID)页面
3. 书籍book_detail.html中书的作者和出版社,有超链接:作者详情author_detail.html(通过书籍ID)和出版社详情publisher_detail.html(通过书籍ID)页面
4. 书籍book_list.html中添加图书超链接,book_add.html
5. 书籍book_list.html中修改图书超链接,book_edit.html
6. 书籍book_list.html中删除图书超链接,book_delete.html

二、实现步骤

1、创建每个模块的模型models.py
2、创建每个模块的html页面
3、创建每个模块的视图函数views.py
4、编写每个模块的子路由urls.py
5、运行测试每个模块访问
    http://127.0.0.1:8000/book/detail/1
    http://127.0.0.1:8000/book/list/
    http://127.0.0.1:8000/book/index/
    .....

注意:分模块操作

 三、数据表关系

书籍表 Book:title 、 pub_date 、 publisher(多对多) 、 author(外键,多对一)

出版社表 Publisher:name 、address、city 、state_province、 country、website

作者表 Author:first_name、 last_name、 email、 gender

注意:自动生成中间表 book_publisher 

四、创建bookitem项目

 在控制台执行子应用: python manage.py startapp book

五、编码显示

(1)模型层models.py

from django.db import models

# Create your models here.
#作者数据模型
class Author(models.Model):
    first_name=models.CharField(max_length=30)
    last_name=models.CharField(max_length=30)
    email=models.EmailField()
    # gender=models.BooleanField(default=True)
    gender_choices=(
         (0,'女'),
         (1,'男'),
         (2,'保密'),
     )
    gender=models.SmallIntegerField(choices=gender_choices)

    class Meta:
        db_table='author'
        verbose_name='作者'
        verbose_name_plural=verbose_name

    def __str__(self):
        return self.first_name+self.last_name
from django.db import models

# Create your models here.
#出版社数据模块
class Publisher(models.Model):
    name=models.CharField(max_length=30)
    address=models.CharField(max_length=100)
    city=models.CharField(max_length=30)
    state_province=models.CharField(max_length=30)
    country=models.CharField(max_length=30)
    website=models.URLField()

    class Meta:
        db_table = 'publisher'
        verbose_name = '出版社'
        verbose_name_plural = verbose_name


    def __str__(self):
        return self.name
from django.db import models
from author.models import  Author  #导入数据模型
from publisher.models import Publisher

# Create your models here.
# 书籍数据模型
class Book(models.Model):
    title=models.CharField(max_length=100,verbose_name='书名')
    publish_date=models.DateField(verbose_name='出版时间')
    #FK关联
    #fk:book:Author作者数据模型=N:1(多对一)
    author=models.ForeignKey(Author,on_delete=models.PROTECT,verbose_name='作者')
    #多对多 book:Publisher 出版社数据模型(多对多)
    publisher=models.ManyToManyField(Publisher,verbose_name='出版社')



    class Meta:
        db_table = 'book'
        verbose_name = '书籍'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title

 数据迁移,生成相关表

在终端依次执行命令
python manage.py makemigrations
python manage.py migrate 

手动添加相关数据 

(2)视图层views.py

from django.shortcuts import render
from author.models import *

# Create your views here.
#作者详情
def author_detail(request,aid):
    '''
    通过aid获取作者详情信息
    :param request:
    :param aid:
    :return:
    '''
    author=Author.objects.get(pk=aid)
    return  render(request,'author/author_detail.html',{'author':author})
from django.shortcuts import render
from publisher.models import *
# Create your views here.
#出版社详情
def publisher_detail(request,pid):
    publisher=Publisher.objects.get(pk=pid)
    return  render(request,'publisher/publisher_detail.html',{"publisher":publisher})
from django.shortcuts import render, redirect
from book.models import *
from author.models import *
from publisher.models import *


# Create your views here.
# 书籍首页
def book_index(request):
    return render(request, 'book/book_index.html')
    # return render(request, 'book/book_home.html')


# 书籍列表
def book_list(request):
    '''
    获取所有的书籍
    :param request:
    :return:
    '''
    books = Book.objects.all()
    return render(request, 'book/book_list.html', {'books': books})


# 书籍详情
def book_detail(request, bid):
    '''
    获取bid对应的书籍
    :param request:
    :param bid:
    :return:
    '''
    book = Book.objects.get(pk=bid)
    return render(request, 'book/book_detail.html', {'book': book})


# 书籍添加
def book_add(request):
    if request.method == 'POST':
        # 获取书名,出版时间,作者,出版社列表
        title = request.POST.get('title')
        publish_date = request.POST.get('publish_date')
        author_id = request.POST.get('author')
        #*列表:getlist
        publisher_list = request.POST.getlist('publisher')
        # 操作数据库存储数据
        book_obj = Book.objects.create(title=title, publish_date=publish_date, author_id=author_id)
        # 书籍与出版社的关系表
        book_obj.publisher.add(*publisher_list)
        # 跳转到书籍的展示页面
        # 直接跳转对应的列表数据,使用别名name=list
        return redirect('../list')

    # 获取当前系统所有的出版社和作者信息
    publishers = Publisher.objects.all()
    # print(publishers)
    authors = Author.objects.all()
    # print(authors)
    #返回添加页面
    return render(request, 'book/book_add.html', locals())


# 书籍编辑
def book_edit(request, bid):
    '''
    获取bid对应的书籍
    :param request:
    :param bid:
    :return:
    '''
    if request.method == 'POST':
        # 获取书名,出版时间,作者,出版社列表
        title = request.POST.get('title')
        publish_date = request.POST.get('publish_date')
        author_id = request.POST.get('author')
        # *列表:getlist
        publisher_list = request.POST.getlist('publisher')
        # 操作数据库修改数据
        Book.objects.filter(pk=bid).update(title=title,publish_date=publish_date,author_id=author_id)

        # 修改第三张表
        book_obj=Book.objects.filter(pk=bid).first()
        # 修改出版社列表
        book_obj.publisher.set(publisher_list)

        # 跳转到书籍的展示页面
        # 直接跳转对应的列表数据,使用别名name=list
        return redirect('../list')

    # 获取当前用户想要编辑的书籍对象,展示给用户看
    edit_obj = Book.objects.filter(pk=bid).first()
    # 获取当前系统所有的出版社和作者信息
    publishers = Publisher.objects.all()
    # print(publishers)
    authors = Author.objects.all()
    # print(authors)

    return render(request, 'book/book_edit.html',  locals())




# 书籍删除
def book_delete(request, bid):
    #删除书籍
    Book.objects.filter(pk=bid).delete()
    # 跳转到书籍的展示页面
    # 直接跳转对应的列表数据,使用别名name=list
    return redirect('../list')

(3)路由层urls.py

from django.contrib import admin
from django.urls import path
from book.views import *  #导入视图

urlpatterns = [
    path('index/', book_index, name='index'),
    path('list/', book_list, name='list'),
    # 注意参数名必须与视图定义的参数名字相同,起个别名name
    path('detail/<int:bid>', book_detail, name='detail'),

    #添加书籍
    path('add/', book_add, name='add'),

    # 注意参数名必须与视图定义的参数名字相同,起个别名name
    #修改书籍
    path('edit/<int:bid>', book_edit, name='edit'),

    # 删除书籍
    path('delete/<int:bid>', book_delete, name='delete'),
]


from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    #
    path('author/', include(('author.urls','author'),namespace='author')), #子路由author
    path('book/', include(('book.urls','book'),namespace='book')), #子路由book
    path('publisher/', include(('publisher.urls','publisher'),namespace='publisher')), #子路由publisher
    path('admin/', admin.site.urls), #后台管理路由
]

(4)模板页面html

       (1) 首页页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        <h1>书籍首页</h1>
        <hr/>
        {# book命名空间 ,list是别名 #}
        <a href="{% url 'book:list' %}">查看所有的书籍</a>
</body>
</html>

       (2) 图书展示页面 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {# css #}
    {% block extcss %}
        <!-- 新 Bootstrap4 核心 CSS 文件 -->
        <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
    {% endblock %}
    {% block extJs %}
        <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
        <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>

        <!-- bootstrap.bundle.min.js 用于弹窗、提示、下拉菜单,包含了 popper.min.js -->
        <script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>

        <!-- 最新的 Bootstrap4 核心 JavaScript 文件 -->
        <script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
    {% endblock %}
</head>
<body>
    <h1 class="text-center">书籍信息</h1>

    <a href="{% url 'book:add' %}" class="btn btn-primary btn-xs">添加</a>
    <br>
    <table class="table table-hover table-striped">
        <thead>
        <tr>
            <th>ID</th>
            <th>书名</th>
            <th>出版日期</th>
            <th>出版社</th>
            <th>作者</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for book in books %}
            <tr>
                <td>{{ book.pk }}</td>
                <td><a href="{% url 'book:detail' book.id %}">{{ book.title }}</a></td>
                {#格式化日期#}
                <td>{{ book.publish_date|date:'Y-m-d' }}</td>
                <td>
                    {% for publish in book.publisher.all %}
                    {# 判断是最后一个不加,#}
                      {% if forloop.last %}
                        {{publish.name }}
                    {# 判断是其他加,#}
                      {% else %}
                         {{publish.name }},
                      {% endif %}

                    {% endfor %}
                </td>
                <td> {{book.author.first_name }}{{book.author.last_name }}</td>
                <td>
                    <a href="{% url 'book:edit' book.pk %}" class="btn btn-primary btn-xs">编辑</a>
                    <a href="{% url 'book:delete' book.pk %}" class="btn btn-primary btn-xs">删除</a>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
</body>

       (3) 图书添加页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {# css #}
    {% block extcss %}
        <!-- 新 Bootstrap4 核心 CSS 文件 -->
        <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
    {% endblock %}
</head>
<body>
     <h1 class="text-center">书籍添加</h1>
     <hr/>
    <form action="" method="post">
     {# 确认html中的form添加模板标签,否则发生异常#}
     {% csrf_token %}
        <p>书名:
            <input type="text" name="title" class="form-control">
        </p>
        <p>出版日期:
            <input type="date" name="publish_date" class="form-control">
        </p>
        <p>出版社:
            <select name="publisher" id=""  multiple class="form-control">
                {% for publish_obj in publishers %}
                    <option value="{{ publish_obj.pk }}">{{ publish_obj.name }}</option>
                {% endfor %}
            </select>
        </p>
        <p>作者:
            <select name="author" id=""  class="form-control">
                {% for author_obj in authors %}
                    <option value="{{ author_obj.pk }}">{{ author_obj.first_name }}{{ author_obj.last_name }}</option>
                {% endfor %}
            </select>
        </p>
        <input type="submit" value="新增" class="btn btn-primary btn-block">
    </form>

</body>
</html>

       (4) 图书修改页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {# css #}
    {% block extcss %}
        <!-- 新 Bootstrap4 核心 CSS 文件 -->
        <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
    {% endblock %}
</head>
<body>
<h1 class="text-center">书籍编辑</h1>
<form action="" method="post">
     {# 确认html中的form添加模板标签,否则发生异常#}
     {% csrf_token %}
    <p>书名:
        <input type="text" name="title" class="form-control" value="{{ edit_obj.title }}">
    </p>
    <p>出版日期:
        <input type="date" name="publish_date" class="form-control"
               value="{{ edit_obj.publish_date|date:'Y-m-d' }}">
    </p>
    <p>出版社:
        <select name="publisher" id="" multiple class="form-control">
            {% for publish_obj in publishers %}
                {# 针对当前书籍对象的出版社应该默认选中 #}
                  {% if publish_obj in edit_obj.publisher.all %}
                    <option value="{{ publish_obj.pk }}" selected>{{ publish_obj.name }}</option>
                {% else %}
                    <option value="{{ publish_obj.pk }}">{{ publish_obj.name }}</option>
                {% endif %}

            {% endfor %}

        </select>
    </p>
    <p>作者:
        <select name="author" id=""  class="form-control">
            {% for author_obj in authors%}
                {% if author_obj == edit_obj.author %}
                    <option value="{{ author_obj.pk }}" selected>{{ author_obj.first_name }}{{ author_obj.last_name }}</option>
                {% else %}
                    <option value="{{ author_obj.pk }}">{{ author_obj.first_name }}{{ author_obj.last_name }}</option>
                {% endif %}

            {% endfor %}

        </select>
    </p>
    <input type="submit" value="确定编辑" class="btn btn-info btn-block">
</form>

</body>
</html>

       (5) 图书详情页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>书籍详情页</h1>
    <hr/>
    <div>
       <p>名称:{{ book.title }}</p>
       <p>出版时间:{{ book.publish_date }}</p>
       <p>作者:
           <a href="{% url 'author:detail' book.author.id %}">
             {{ book.author.first_name }}{{ book.author.last_name }}
           </a>
       </p>

        <p>出版社:
            {% for publisher in book.publisher.all %}
               <a href="{% url 'publisher:detail' publisher.id  %}">
                 {{ publisher.name}}
               </a>
                {# 每个出版社之间加分割|#}
                {%  if not forloop.last %}
                    |
                {% endif %}
            {% endfor %}
       </p>
    </div>

</body>
</html>

       (6) 作者详情页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>作者详情页</h1>
    <hr/>
    <div>
           <p>名字:{{ author.last_name }}{{ author.last_name }}</p>
           <p>性别:{{author.gender }}</p>
           <p>邮箱:{{author.email }}</p>
    </div>
</body>
</html>

       (7) 出版社详情页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>出版社详情页</h1>
    <hr/>
      <div>
           <p>名字:{{ publisher.name }}</p>
           <p>地址:{{publisher.address }}</p>
           <p>城市:{{publisher.city }}</p>
           <p>省份:{{publisher.state_province }}</p>
           <p>国家:{{publisher.country }}</p>
           <p>网址:{{publisher.website }}</p>
    </div>
</body>
</html>

四、效果

图书信息 

 图书详情

作者详情

出版社详情

图书添加

单击添加按钮

返回列表显示 

图书修改

 单击编辑跳转

  修改数据 

   修改后数据显示

图书删除

  单击删除按钮

注意:删除书籍信息,相关的中间表的也删除数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

现代雷达车载应用——第3章 MIMO雷达技术 3.2节 汽车MIMO雷达波形正交策略

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 3.2 汽车MIMO雷达波形正交策略 基于MIMO雷达技术的汽车雷达虚拟阵列合成依赖于不同天线发射信号的可分离性。当不同天线的发射信号正交时&#x…

德人合科技 | 设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统

设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统 PC端访问地址&#xff1a; www.drhchina.com 一、背景介绍 设计公司通常涉及到大量的创意作品、设计方案、客户资料等重要文件&#xff0c;这些文件往往包含公司的核心价值和商业机密。因此&#xff0c;如何确保…

百年东芝“瞄准”汽车「芯」机遇

在汽车“新四化”大变革的驱动下&#xff0c;汽车半导体市场进入需求暴涨的新周期。 “智能电动汽车所需要的半导体种类和数量正在急剧增加。” 东芝电子分立器件应用技术部经理成栋表示&#xff0c;东芝电子正在加大汽车半导体市场的布局&#xff0c;从而满足汽车电动化、智能…

[node]Node.js 中REPL简单介绍

[node]Node.js 中REPL简单介绍 什么是REPL为什么使用REPL如何使用REPL 命令REPL模式node的全局内容展示node全局所有模块查看全局模块具体内容其它命令 实践 什么是REPL Node.js REPL(Read Eval Print Loop:交互式解释器) 表示电脑的环境&#xff0c;类似 Windows 系统的终端或…

在x64上构建智能家居(home assistant)(二)(新版Debain12)连接Postgresql数据库

新版数据库安装基本和旧版相同,大部分可以参考旧版本在x64上构建智能家居(home assistant)&#xff08;二&#xff09;连接Postgresql数据库_homeassist 数据库-CSDN博客 新版本的home assistant系统安装,我在原来写的手顺上直接修改了,需要的可以查看在x64上构建智能家居(home…

vivado 主时钟分析

主时钟 主时钟是通过输入端口或千兆位进入设计的板时钟收发器输出引脚&#xff08;例如恢复的时钟&#xff09;。主时钟只能由create_clock命令定义。主时钟必须附加到网表对象。此网表对象表示中的点所有时钟边沿源自其并在时钟树上向下游传播的设计。换句话说&#xff0c;主…

深入理解 Rust 中的容器类型及其应用

Rust 作为一种系统编程语言&#xff0c;提供了丰富的容器类型来处理各种数据结构和算法。这些容器类型不仅支持基本的数据存储和访问&#xff0c;还提供了高效的内存管理和安全性保障。本文将详细介绍 Rust 中的几种主要容器类型&#xff0c;包括它们的用法、特点和适用场景&am…

使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理

背景 在上一篇文章中&#xff0c;我们已经了解到华为即将发布的鸿蒙操作系统纯血版本——鸿蒙 Next&#xff0c;以及各个互联网厂商开展鸿蒙应用开发的消息。其中&#xff0c;Taro作为一个重要的前端开发框架&#xff0c;也积极适配鸿蒙的新一代语言框架 —— ArkTS。 本文将…

力扣每日一题day37[113.路径总和ii]

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

推荐一个vscode看着比较舒服的主题:Dark High Contrast

主题名称&#xff1a;Dark High Contrast &#xff08;意思就是&#xff0c;黑色的&#xff0c;高反差的&#xff09; 步骤&#xff1a;设置→Themes→Color Theme→Dark High Contrast 效果如下&#xff1a; 感觉这个颜色的看起来比较舒服。

jetbrains idea 报错 java.lang.ClassNotFoundException 之后自动搜索包导入包

-- 搜索类所在的包 导入包 搜索包 mac环境 pom中右键或者 cmdn

CSS:盒子模型

CSS&#xff1a;盒子模型 盒子模型盒子模型的组成盒子内容边框 border内边距 padding盒子实际大小计算CSS3的盒子类型content-boxborder-box 外边距 margin外边距合并相邻块元素垂直外边距合并嵌套块元素垂直外边距塌陷 行内元素的内外边距 盒子相关属性圆角边框盒子阴影 盒子模…

Linux基本内容学习

Linux 命令 文件命令 命令释义语法格式lslist&#xff0c;用于显示目录中文件及其属性信息ls [参数名] [文件名]cdchange directory&#xff0c;用于更改当前所处的工作目录&#xff0c;路径可以是绝对路径&#xff0c;也可以是相对路径&#xff0c;若省略不写则会跳转至当前…

黑马点评09 秒杀功能总结

1.整体业务流程 1.1 redis判断流程 &#xff08;单线程&#xff09; 1.首先获取订单id和用户id&#xff0c;调用lua脚本进行redis操作&#xff0c;lua内包括 对购买资格/库存充足的判断 、 扣库存下单、发送订单消息到Stream。 2.Stream组成消息队列&#xff0c;有异常自动放到…

6. 行为模式 - 观察者模式

亦称&#xff1a; 事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 观察者模式是一种行为设计模式&#xff0c; 允许你定义一种订阅机制&#xff0c; 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 问题 假如你有两种类型的对象&#xff1a; ​ 顾…

全自动双轴晶圆划片机:半导体制造的关键利器

随着科技的飞速发展&#xff0c;半导体行业正以前所未有的速度向前迈进。在这个过程中&#xff0c;全自动双轴晶圆划片机作为一种重要的设备&#xff0c;在半导体晶圆、集成电路、QFN、发光二极管、miniLED、太阳能电池、电子基片等材料的划切过程中发挥着举足轻重的作用。 全自…

【单调栈】LeetCode2334:元素值大于变化阈值的子数组

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 题目 给你一个整数数组 nums 和一个整数 threshold 。 找到长度为 k 的 nums 子数组&#xff0c;满足数组中 每个 元素都 大于 threshold / k 。 请你返回满足要求的 任意 子数组的 大小 。如果没有这…

LLM之RAG实战(七)| 使用llama_index实现多模态RAG

一、多模态RAG OpenAI开发日上最令人兴奋的发布之一是GPT-4V API&#xff08;https://platform.openai.com/docs/guides/vision&#xff09;的发布。GPT-4V是一个多模态模型&#xff0c;可以接收文本/图像&#xff0c;并可以输出文本响应。最近还有一些其他的多模态模型&#x…

flutter开发windows应用的库

一、window_manager 这个插件允许 Flutter 桌面应用调整窗口的大小和位置 地址&#xff1a;https://github.com/leanflutter/window_manager二、win32 一个包&#xff0c;它使用FFI包装了一些最常见的Win32 API调用&#xff0c;使Dart代码可以访问这些调用&#xff0c;而不需…

探索鸿蒙:了解华为鸿蒙操作系统的基础课程

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习产出&#xff1a; 介绍鸿蒙操作系统的起源和发展历程。 理解鸿蒙操作系统的核心概念和体系结构。 学习如何搭建和配置鸿蒙开发环境。 掌握基础的鸿蒙应用开发技术&#xff0c;包括应用的创建、…