首页 > 技术文章 > 基于python和Django开发图书管理系统

simon1993 2021-11-07 13:26 原文

文件目录

模型

from django.db import models


# Create your models here.


class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()

    # 与AuthorDetail建立一对一的关系
    authorDetail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)


class AuthorDetail(models.Model):
    nid = models.AutoField(primary_key=True)
    birthday = models.DateField()
    telephone = models.BigIntegerField()
    addr = models.CharField(max_length=64)


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()


class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)

    # 与Publish建立一对多的关系,外键字段建立在多的一方
    publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE)
    # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
    authors = models.ManyToManyField(to="Author")

路由设置:

from django.contrib import admin
from django.urls import path,re_path
from app02 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
    path('book/',views.book),
    path('addbook/',views.addbook),
    re_path(r"book/(\d+)/delete",views.delbook),
    re_path(r"book/(\d+)/change",views.changebook),
]

视图设置:

from django.shortcuts import render,HttpResponse,redirect
from app02.models import Publish,Book,Author,AuthorDetail
from django.db.models import Count,Max,Min,Sum,Avg
# Create your views here.

def index(request):
    book_obj = Book.objects.all()
    for book in book_obj:
        print(book.authors.all().values('name'))


    return HttpResponse(book)


def book(request):
    '''
    查看图书馆书籍
    :param request:
    :return:
    '''
    book_obj = Book.objects.all()


    return render(request,'book.html',{"book_list":book_obj})


def addbook(request):
    '''
    添加书籍
    :param request:
    :return:
    '''
    publish_list = Publish.objects.all()
    authors_list = Author.objects.all()

    if request.method=="POST":
        title=request.POST.get("title")
        price=request.POST.get("price")
        pub_date=request.POST.get("pub_date")
        publish_id=request.POST.get("publish_id")
        authors_id_list=request.POST.getlist("authors_id_list") # checkbox,select

        book_obj=Book.objects.create(title=title,price=price,publishDate=pub_date,publish_id=publish_id)
        # print(authors_id_list) # ['2', '3']

        book_obj.authors.add(*authors_id_list)

        return redirect('/book/')

    return render(request,'addbook.html',locals())

def delbook(request,id):
    '''
    编辑书籍
    :param request:
    :param id:
    :return:
    '''
    Book.objects.filter(id=id).delete()
    return redirect('/book/')

def changebook(request,id):
    edit_book_obj=Book.objects.filter(pk=id).first()

    if  request.method=="POST":
        title=request.POST.get("title")
        price=request.POST.get("price")
        pub_date=request.POST.get("pub_date")
        publish_id=request.POST.get("publish_id")
        authors_id_list=request.POST.getlist("authors_id_list") # checkbox,select

        Book.objects.filter(pk=id).update(title=title,price=price,publishDate=pub_date,publish_id=publish_id)
        # edit_book_obj.authors.clear()
        # edit_book_obj.authors.add(*authors_id_list)

        edit_book_obj.authors.set(authors_id_list)

        return redirect("/book/")




    publish_list=Publish.objects.all()
    author_list=Author.objects.all()

    return render(request,"changebook.html",{"edit_book_obj":edit_book_obj,"publish_list":publish_list,"author_list":author_list})


模板设置三个文件:查看、新增和编辑页面

查看页面:book

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/statics/bootstrap/css/bootstrap.css">
</head>
<body>

<h3>查看书籍</h3>


<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">

            <a href="/addbook/" class="btn btn-primary">添加书籍</a>
            <table class="table table-bordered table-hover table-striped">

                <thead>
                <tr>
                    <th>编号</th>
                    <th>书籍名称</th>
                    <th>价格</th>
                    <th>出版日期</th>
                    <th>出版社</th>
                    <th>作者</th>
                    <th>操作</th>

                </tr>
                </thead>
                <tbody>
                {% for book in book_list %}
                    <tr>
                        <td>{{ forloop.counter }}</td>
                        <td>{{ book.title }}</td>
                        <td>{{ book.price }}</td>
                        <td>{{ book.publishDate|date:"Y-m-d" }}</td>
                        <td>
                            {{ book.publish.name }}
                        </td>
                        <td>
                            {% for author in book.authors.all %}
                                {% if forloop.last %}
                                    <span>{{ author.name }}</span>
                                {% else %}
                                    <span>{{ author.name }}</span>,
                                {% endif %}

                            {% endfor %}

                        </td>

                        <td>
                            <a href="/book/{{ book.pk }}/change/" class="btn btn-warning">编辑</a>
                            <a href="/book/{{ book.pk }}/delete/" class="btn btn-danger">删除</a>
                        </td>

                    </tr>
                {% endfor %}

                </tbody>
            </table>
        </div>
    </div>
</div>




</body>
</html>

增加数据页面addbook

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/statics/bootstrap/css/bootstrap.css">
</head>
<body>

<h3>添加书籍</h3>


<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <form action="" method="post">
                {% csrf_token %}
                <div class="form-group">
                    <label for="">名称</label>
                    <input type="text" name="title" class="form-control" value="">
                </div>

                <div class="form-group">
                    <label for="">价格</label>
                    <input type="text" name="price" class="form-control">
                </div>

                <div class="form-group">
                    <label for="">出版日期</label>
                    <input type="date" name="pub_date" class="form-control">
                </div>

                <div class="form-group">
                    <label for="">出版社</label>
                    <select name="publish_id" id="" class="form-control">
                        {% for publish in publish_list %}
                            <option value="{{ publish.pk }}">{{ publish.name }}</option>
                        {% endfor %}
                    </select>
                </div>

                <div class="form-group">
                    <label for="">作者</label>
                    <select type="text" name="authors_id_list" multiple class="form-control">
                        {% for author in authors_list %}
                            <option value="{{ author.pk }}">{{ author.name }}</option>
                        {% endfor %}

                    </select>
                </div>
                <input type="submit" class="btn btn-default">

            </form>
        </div>
    </div>
</div>




</body>
</html>

编辑页面changebook

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/statics/bootstrap/css/bootstrap.css">
</head>
<body>

<h3>编辑书籍</h3>


<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <form action="" method="post">
                {% csrf_token %}
                <div class="form-group">
                    <label for="">名称</label>
                    <input type="text" name="title" class="form-control" value="{{ edit_book_obj.title }}">
                </div>

                <div class="form-group">
                    <label for="">价格</label>
                    <input type="text" name="price" class="form-control" value="{{ edit_book_obj.price }}">
                </div>

                <div class="form-group">
                    <label for="">出版日期</label>
                    <input type="date" name="pub_date" class="form-control"
                           value="{{ edit_book_obj.publishDate|date:'Y-m-d' }}">
                </div>

                <div class="form-group">
                    <label for="">出版社</label>
                    <select name="publish_id" id="" class="form-control">
                        {% for publish in publish_list %}
                            {% if edit_book_obj.publish == publish %}
                                <option selected value="{{ publish.pk }}">{{ publish.name }}</option>
                            {% else %}
                                <option value="{{ publish.pk }}">{{ publish.name }}</option>
                            {% endif %}
                        {% endfor %}
                    </select>
                </div>

                <div class="form-group">
                    <label for="">作者</label>
                    <select type="text" name="authors_id_list" multiple class="form-control">
                        {% for author in author_list %}

                            {% if author in edit_book_obj.authors.all %}
                                <option selected value="{{ author.pk }}">{{ author.name }}</option>
                            {% else %}
                                <option value="{{ author.pk }}">{{ author.name }}</option>
                            {% endif %}

                        {% endfor %}
                    </select>
                </div>
                <input type="submit" class="btn btn-default">

            </form>
        </div>
    </div>
</div>


</body>
</html>

推荐阅读