图书管理系统整理思路

第一步:

建立表然后执行迁移命令:

from django.db import models

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    create_time = models.DateField(auto_now_add=True)
    # 外键建在多的那一方
    publish = models.ForeignKey(to='Publish')
    # 多对多不会成为字段,只是绑定一种关系,建立在使用频率高的那一方
    authors = models.ManyToManyField(to='Author')

class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)
    email = models.EmailField()

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # 一对一关系的建立
    authordetail = models.OneToOneField(to='AuthorDetail')

class AuthorDetail(models.Model):
    addr = models.CharField(max_length=32)
    phone = models.IntegerField()

第二步:

定义home主页,并且将home作为父模板,在巨幕那里用block框起来,导航,左列表,面板固定不变,子模板只需要重写父模板

巨幕:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
    <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<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="#">Brand</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="#">Link <span class="sr-only">(current)</span></a></li>
                <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>
                        <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="submit" 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>
<div class="container">
    <div class="row">
        <div class="col-md-3">
            <div class="list-group">
                <a href="#" class="list-group-item active">
                    图书管理系统
                </a>
                <a href="/booklist/" class="list-group-item">图书信息</a>
                <a href="#" class="list-group-item">出版社信息</a>
                <a href="#" class="list-group-item">作者信息</a>
                <a href="#" class="list-group-item">Vestibulum at eros</a>
            </div>
        </div>
        <div class="col-md-9">
            <div class="panel panel-primary">
                <div class="panel-heading">
                    <h3 class="panel-title">Panel title</h3>
                </div>
                <div class="panel-body">
                    {#  把这里作为子模板重写的地方 #}
                    {% block content %}
                        <div class="jumbotron">
                            <h1>Hello, world!</h1>
                            <p>...</p>
                            <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
                        </div>
                    {% endblock %}
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html
View Code

 第三步:

我们点击图书列表的时候,我们需要给用户展示一个图书信息的页面,图书列表的那个a标签路径定义为/booklist/,然后去路由写下booklist,在写下相应的视图函数,我们将数据库所有的图书取出来,在前端for循环,然后得到每个对象,通过对象点属性,得到图书的信息,通过teble标签展示给用户,代码如下:

def booklist(request):
    book_list = models.Book.objects.all()
    return render(request, 'booklist.html', locals())
view
{% extends 'home.html' %}

{% block content %}
    <a href="/addbook/" class="btn bg-primary text-center">添加数据</a>
    <table class="table table-striped table-hover table-bordered">
        <thead>
        <tr>
            <th>id</th>
            <th>书名</th>
            <th>价格</th>
            <th>出版日期</th>
            <th>出版社</th>
            <th>作者</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for book in book_list %}
            <tr>
                <td>{{ book.pk }}</td>
                <td>{{ book.name }}</td>
                <td>{{ book.price }}</td>
                <td>{{ book.create_time }}</td>
                <td>{{ book.publish.name }}</td>
                    <td>
                    {% for author in book.authors.all %}
                        {% if forloop.last %}
                            {{ author.name }}
                        {% else %}
                            {{ author.name }},
                        {% endif %}
                    {% endfor %}
                    </td>

                <td>
                    <a href="/edit/{{ book.pk }}/" class="btn bg-success">编辑</a>
                    <a href="/delect/{{ book.pk }}/" class="btn btn-danger">删除</a>
                </td>
            </tr>
        {% endfor %}

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

 第四步:

我们设置增加数据,编辑,删除三个a标签,首先添加数据,我们第一步在添加数据的a标签写下addbook的路径,再去路由和视图写下匹配

的路由和函数,再去templates文件夹写下addbook.html,首先写一个form表单,POST提交方式,出版社和作者我们写select,那么我们要

将数据库所有的出版社和作者取出来,然后写在前端,对于作者是多对多的关系,所以我们要if判断,如果是最后一个我们直接{{author.name}},不是最后一个我们需要加一个逗号,我们在后端可以通过request.POST.get()来获取我们提交的数据,然后在通过

models.Book.object.create(name=name,...)来创建一个对象,但是我们要绑定书和作者的关系,所以提交的值是publish.pk和authors.pk

前端我们通过book_obj.authors.add(authors_list_id)来绑定与作者的关系。

def addbook(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        price = request.POST.get('price')
        date = request.POST.get('date')
        publish_id = request.POST.get('publish')
        authors_list_id = request.POST.getlist('authors')
        book_obj = models.Book.objects.create(name=name, price=price, create_time=date, publish_id=publish_id)
        book_obj.authors.add(*authors_list_id)
        return redirect('/booklist')
    publish_list = models.Publish.objects.all()
    author_list = models.Author.objects.all()
    return render(request, 'addbook.html', locals())

第五步,编辑数据首先要找出你要编辑书籍的id,我们可以通过无名分组,将book.pk写在编辑标签的路径,在路由匹配,分组得到book.pk,通过它我们可以获取要编辑的书籍对象,接下来我们我们写下一个form表单,通过book.obj来点属性,但是出版社我们要做判断

首先 我们取出数据库中所有的的出版社和作者,在for循环,if  publish==book_obj.publish,那么我们就给他设置默认选中,至于作者那里

我们 if  author  in  book_obj.authors.all 来做判断。

{% extends 'home.html' %}

{% block content %}
    <h2 class="text-center">编辑数据</h2>
    <form action="" method="post">
        书名:<input type="text" class="form-control" name="name" value="{{ book_obj.name }}">
        价格:<input type="text" class="form-control" name="price" value="{{ book_obj.price }}">
        出版时间:<input type="date" class="form-control" name="date" value="{{ book_obj.create_time|date:'Y-m-d'}}">

       <p>出版社:
           <select name="publish" id="" class="form-control">
               {% for publish in publish_list %}
              {% if publish == book_obj.publish %}
                  <option value="{{ publish.pk }}" selected>{{ publish.name }}</option>
                  {% else %}
                  <option value="{{ publish.pk }}" >{{ publish.name }}</option>
              {% endif %}
               {% endfor %}
               
           </select>
       </p>
    <p>作者:
        <select name="authors" id="" class="form-control" multiple>
            {% for author in author_list %}
                {% if author in book_obj.authors.all %}
                 <option value="{{ author.pk }}" selected>{{ author.name }}</option>
                    {% else %}
                    <option value="{{ author.pk }}">{{ author.name }}</option>
                {% endif %}
            {% endfor %}
        </select>
    </p>
        <input type="submit" class="btn-danger pull-right">
    </form>



{% endblock %}
View Code
def edit(request, edit_id):
    # 不管什么请求都可以得到edit_id,因为get请求提交数据,分组将edit_id传过去了,
    # post请求的话默认向当前路径提交
    book_obj = models.Book.objects.filter(id=edit_id).first()
    if request.method == 'POST':
        name = request.POST.get('name')
        price = request.POST.get('price')
        date = request.POST.get('date')
        publish_id = request.POST.get('publish')
        author_id = request.POST.get('authors')
        print(author_id)
        models.Book.objects.filter(id=edit_id).update(name=name, price=price, create_time=date, publish_id=publish_id)
        # 绑定书籍和作者关系
        book_obj.authors.set(author_id)
        return redirect('/booklist')
    publish_list = models.Publish.objects.all()
    author_list = models.Author.objects.all()
    return render(request, 'edit.html', locals())
View Code

第六步:删除数据,根据无名分组传过去的id,直接delete()就行。

 

 

 

 

 

 

转载于:https://www.cnblogs.com/jingandyuer/p/11005631.html

1. 能按各种方式(比如书名、编号、作者)查询图书馆的藏书情况。 2. 能够方便地借阅图书、续借图书、归还图书。 3. 能够查询自己的基本资料、借阅图书情况。 4. 能够熟悉图书管理系统的使用 能方便的对图书进行录入登记,注销陈旧的书籍。 2. 能够方便地对读者进行登记,或注销读者生信息(基本信息,借阅信息)。 2 功能说明 系统功能分析是在系统开发的总体任务的基础上完成。本系统需要完成的功能主要有5部分: 2.1 图书基本情况 1.书籍类别标准的制定,类别信息的输入,包括类别编号,类别名称,关键词,备注信息等。 2.书籍类别信息的查询,修改,包括类别编号,类别名称,关键词,备注信息等。 3.书籍信息的输入,包括书籍编号,书籍名称,书籍类别,作者名称,出版社名称,出版日期,书籍页数,关键词,登记日期,备注信息等。 2.2 办理借书证 1.新生办理借书证。 2.丢失办理借书证。 2.3 实现借书功能 1.借书信息的输入,包括借书信息编号,读书编号,读者姓名,书籍编号,书籍名称,借书日期,备注信息等。 2.借书信息的查询,修改,包括借书信息编号,读者编号,读者姓名,书籍编号,书籍名称,借书日期,备注信息等。 2.4 实现还书功能 1.还书信息的输入,包括还书信息编号,读者编号,读者姓名,书籍编号,书籍名称,借书日期,还书日期,备注信息等。 2.还书信息的查询和修改,包括还书信息编号,读书编号,读者姓名,书籍编号,书籍名称,借书日期,还书日期,备注信息等。 2.5 图书查询 可以对图书进行的精确、模糊查询并讲查询信息以列表的方式呈现给用户,方便用户查找信息,另外,对超期的借阅情况能自动给出提示信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值