開發圖書增刪改查頁面
需求:
1.列出圖書列表、出版社列表、做者列表
2.點擊做者,會列出其出版的圖書列表
3.點擊出版社,會列出旗下圖書列表
4.能夠建立、修改、刪除 圖書、做者、出版社
主頁信息:
http://127.0.0.1:8000/index/
model.py
from django.db import models # Create your models here. class Book(models.Model): """書表""" id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) publish_date = models.DateField() publisher = models.ForeignKey("Publisher",on_delete=models.CASCADE) author = models.ManyToManyField("Author") class Publisher(models.Model): '''出版社表''' id = models.AutoField(primary_key=True) pname = models.CharField(max_length=32) class Author(models.Model): '''做者表''' id = models.AutoField(primary_key=True) aname = models.CharField(max_length=32)
urls.pycss
from django.contrib import admin from django.urls import path, re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), path('book/', views.book), path('addbook/', views.addbook), re_path(r"^delbook/", views.delbook), #delbook(request,2) re_path(r"^editbook/", views.editbook), #re_path(r"query",views.query), re_path(r'^publisher', views.publisher), re_path(r'^addpublisher', views.addpublisher), re_path(r'^delpublisher', views.delpublisher), re_path(r'^editpublisher', views.editpublisher), re_path(r'^publisher_book', views.publisher_book), re_path(r'^author/', views.author), re_path(r'^addauthor', views.addauthor), re_path(r'^delauthor', views.delauthor), re_path(r'^editauthor', views.editauthor), re_path(r'^author_book', views.author_book), ]
views.pyhtml
from django.shortcuts import render, HttpResponse, redirect # Create your views here. from app01.models import Book from app01 import models #主頁 def index(request): return render(request,"index.html") #添加書籍 def addbook(request): if request.method == 'POST': title = request.POST.get("title") pid = request.POST.get("pid") publish_date = request.POST.get("pub_date") authors = request.POST.getlist("aids") models.Book.objects.create(title=title,publish_date=publish_date,publisher_id=pid) new_book = models.Book.objects.get(title=title) new_book.author.set(authors) return redirect("/book/") pub_list = models.Publisher.objects.all() author_list = models.Author.objects.all() return render(request, "addbook.html", {"pub_list": pub_list, "author_list": author_list}) #查看圖書 def book(request): book_list = Book.objects.all() return render(request, "book.html", {"book_list":book_list}) #刪除書籍 def delbook(request): bid = request.GET.get("bid") book_obj = models.Book.objects.filter(id=bid).first() book_obj.delete() return redirect("/book/") #編輯書籍 def editbook(request): bid = request.GET.get("bid") book_obj = models.Book.objects.filter(id=bid).first() if request.method == "POST": title = request.POST.get("title") pid = request.POST.get("pid") publish_date = request.POST.get("pub_date") authors = request.POST.getlist("aids") models.Book.objects.filter(id=bid).update(title=title, publish_date=publish_date, publisher_id=pid) edit_book = models.Book.objects.get(id=bid) edit_book.author.set(authors) return redirect("/book/") pub_list = models.Publisher.objects.all() author_list = models.Author.objects.all() return render(request,"editbook.html",{"book_obj":book_obj,"pub_list": pub_list, "author_list": author_list}) # def query(request): # ret = Book.objects.filter(publish="老男孩出版社", price__gt=200) # ret = Book.objects.filter(title__startswith="py") # return HttpResponse("ok") #查看出版社 def publisher(request): publisher_list = models.Publisher.objects.all() return render(request, "publisher.html",{"publisher_list":publisher_list} ) def pub_is_valid(xname): """驗證出版社信息""" if models.Publisher.objects.filter(pname=xname).count() != 0: return {"status": "該出版社已存在!"} #增長出版社 def addpublisher(request): if request.method == 'POST': pname = request.POST.get("pname") ret = pub_is_valid(pname) # print(ret) if ret: ret["pname"] = pname return render(request,"addpublisher.html",ret) else: models.Publisher.objects.create(pname=pname) return redirect("/publisher/") return render(request, "addpublisher.html") #編輯出版社 def editpublisher(request): pid = request.GET.get("pid") pub_obj = models.Publisher.objects.filter(id=pid).first() if request.method == "POST": pname = request.POST.get("pname") ret = pub_is_valid(pname) if ret: pub_obj.pname = pname ret["pub_obj"] = pub_obj return render(request,"editpublisher.html",ret) else: models.Publisher.objects.filter(id=pid).update(pname=pname) return redirect("/publisher/") return render(request, "editpublisher.html", {"pub_obj":pub_obj}) #刪除出版社 def delpublisher(request): pid = request.GET.get("pid") publisher_obj = models.Publisher.objects.filter(id=pid).first() publisher_obj.delete() return redirect("/publisher/") #出版社關聯書籍 def publisher_book(request): pid = request.GET.get("pid") pub_obj = models.Publisher.objects.filter(id=pid).first() pname = pub_obj.pname book_list = pub_obj.book_set.all() return render(request, "publisher_book.html") #查看做者 def author(request): author_list = models.Author.objects.all() return render(request, "author.html", {"author_list":author_list}) def author_is_valid(xname): """驗證做者信息""" if models.Author.objects.filter(aname=xname).count() != 0: return {"status": "該做者已存在!"} def addauthor(request): if request.method == 'POST': aname = request.POST.get("aname") ret = author_is_valid(aname) if ret: ret["aname"] = aname return render(request,"addauthor.html",ret) else: models.Author.objects.create(aname=aname) return redirect("/author/") return render(request, "addauthor.html") def delauthor(request): aid = request.GET.get("aid") author_obj = models.Author.objects.filter(id=aid).first() author_obj.delete() return redirect("/author/") # 編輯做者 def editauthor(request): aid = request.GET.get("aid") author_obj = models.Author.objects.filter(id=aid).first() if request.method == "POST": aname = request.POST.get("aname") ret = author_is_valid(aname) if ret: author_obj.aname = aname ret["author_obj"] = author_obj return render(request,"editauthor.html",ret) else: models.Author.objects.filter(id=aid).update(aname=aname) return redirect("/author/") return render(request,"editauthor.html",{"author_obj":author_obj}) #做者關聯書籍;多對多 def author_book(request): aid = request.GET.get("aid") author_obj = models.Author.objects.filter(id=aid).first() aname = author_obj.aname book_list = author_obj.book_set.all() return render(request, "author_book.html")
settings.pyjquery
base.htmldjango
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <link rel="stylesheet" href="/static/bs/css/bootstrap.css"> 7 8 </head> 9 <body> 10 <div class="container"> 11 <h2>圖書管理系統</h2> 12 <br> 13 </div> 14 15 <div class="container"> 16 <ul class="nav nav-tabs" id="myTab"> 17 <li role="presentation" class="active"><a href="/index/">主頁</a></li> 18 <li role="presentation"><a href="/book/">圖書</a></li> 19 <li role="presentation"><a href="/author/">做者</a></li> 20 <li role="presentation"><a href="/publisher/">出版社</a></li> 21 </ul> 22 </div> 23 <br> 24 25 {% block content %} 26 {% endblock %} 27 28 29 </body> 30 <script src="/static/js/jquery-3.3.1.js"></script> 31 <script src="/static/bs/js/bootstrap.js"></script> 32 33 <script> 34 {% block script %} 35 {% endblock %} 36 </script> 37 </html>
addauthor.htmlbootstrap
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container"> 5 <div class="col-md-4"> 6 <h4>添加做者信息</h4> 7 <form action="/addauthor/" method="post"> 8 {% csrf_token %} 9 <div class="form-group"> 10 <label for="author">做者姓名</label> 11 <input type="text" class="form-control" id="author" name="aname" 12 placeholder="請輸入要添加的做者姓名" value="{{ aname }}" style="margin-bottom: 5px;"> 13 <span class="label label-danger">{{ status }}</span> 14 </div> 15 <div class="form-group"> 16 <button type="submit" class="btn btn-primary">提交</button> 17 </div> 18 </form> 19 </div> 20 </div> 21 22 {% endblock %}
addbook.htmlapp
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container"> 5 <div class="col-md-4"> 6 <h4>添加圖書信息</h4> 7 <form action="/addbook/" method="post"> 8 {% csrf_token %} 9 <div class="form-group"> 10 <label for="book">書名</label> 11 <input type="text" class="form-control" id="book" name="title" 12 placeholder="請輸入要添加的書籍名稱"> 13 </div> 14 <div class="form-group"> 15 <b style="margin-bottom: 5px;display: inline-block">請選擇出版社</b> 16 <select class="form-control" name="pid"> 17 {% for pub in pub_list %} 18 <option value={{ pub.id }}>{{ pub.pname }}</option> 19 {% endfor %} 20 </select> 21 </div> 22 <div class="form-group"> 23 <label for="date">出版日期</label> 24 <input type="date" class="form-control" id="date" name="pub_date"> 25 </div> 26 <div class="form-group"> 27 <b style="margin-bottom: 5px;display: inline-block">請選擇做者(可多選)</b> 28 <select class="form-control" multiple name="aids"> 29 {% for author in author_list %} 30 <option value={{ author.id }}>{{ author.aname }}</option> 31 {% endfor %} 32 </select> 33 </div> 34 <div class="form-group"> 35 <button type="submit" class="btn btn-primary">提交</button> 36 </div> 37 </form> 38 </div> 39 </div> 40 41 {% endblock %}
addpublisher.htmlide
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container"> 5 <div class="col-md-4"> 6 <h4>添加出版社信息</h4> 7 <form action="/addpublisher/" method="post"> 8 {% csrf_token %} 9 <div class="form-group"> 10 <label for="publisher">出版社名稱</label> 11 <input type="text" class="form-control" id="publisher" name="pname" 12 placeholder="請輸入要添加的出版社名稱" value="{{ pname }}" style="margin-bottom: 5px;"> 13 <span class="label label-danger">{{ status }}</span> 14 </div> 15 <div class="form-group"> 16 <button type="submit" class="btn btn-primary">提交</button> 17 </div> 18 </form> 19 </div> 20 </div> 21 22 {% endblock %}
author.htmloop
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container" style="padding-bottom: 5px;"> 5 <a href="/addauthor/" class="btn btn-info glyphicon glyphicon-plus">添加做者</a> 6 </div> 7 <div class="container"> 8 <table class="table table-striped table-hover"> 9 <thead> 10 <tr> 11 <th>序號</th> 12 <th hidden>做者ID</th> 13 <th>做者</th> 14 <th>操做</th> 15 </tr> 16 </thead> 17 <tbody> 18 {% for author in author_list %} 19 <tr> 20 <td>{{ forloop.counter }}</td> 21 <td hidden>{{ author.id }}</td> 22 <td><a href="/author_book?aid={{ author.id }}">{{ author.aname }}</a></td> 23 <td> 24 <a class="glyphicon glyphicon-pencil" style="padding-right: 10px" href="/editauthor?aid={{ author.id }}"></a> 25 <a class="glyphicon glyphicon-remove" href="/delauthor?aid={{ author.id }}"></a> 26 </td> 27 28 </tr> 29 {% endfor %} 30 </tbody> 31 </table> 32 33 </div> 34 35 {% endblock %} 36 37 {% block script %} 38 $(function () { 39 $("li[class=active]").parent().children().eq(2).addClass("active").siblings().removeClass("active"); 40 }) 41 {% endblock %}
author_book.htmlpost
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container"> 5 <table class="table table-striped table-hover"> 6 <thead> 7 <tr> 8 <th>序號</th> 9 <th>出版書籍</th> 10 <th>做者</th> 11 </tr> 12 </thead> 13 <tbody> 14 {% for book in book_list %} 15 <tr> 16 <td>{{ forloop.counter }}</td> 17 <td>{{ book.title }}</td> 18 <td>{{ aname }}</td> 19 </tr> 20 {% endfor %} 21 </tbody> 22 </table> 23 24 </div> 25 26 {% endblock %}
book.htmlurl
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container" style="padding-bottom: 5px;"> 5 <a href="/addbook/" class="btn btn-info glyphicon glyphicon-plus">添加圖書</a> 6 </div> 7 <div class="container"> 8 <table class="table table-striped table-hover"> 9 <thead> 10 <tr> 11 <th>序號</th> 12 <th hidden>圖書ID</th> 13 <th>書名</th> 14 <th>做者</th> 15 <th>出版日期</th> 16 <th>出版社</th> 17 <th>操做</th> 18 </tr> 19 </thead> 20 <tbody> 21 {% for book in book_list %} 22 <tr> 23 <td>{{ forloop.counter }}</td> 24 <td hidden>{{ book.id }}</td> 25 <td>{{ book.title }}</td> 26 <td> 27 {% for author in book.author.all %} 28 {{ author.aname }} 29 {% endfor %} 30 </td> 31 <td>{{ book.publish_date|date:"Y-m-d" }}</td> {# filter格式化日期 #} 32 <td>{{ book.publisher.pname }}</td> 33 <td> 34 <a class="glyphicon glyphicon-pencil" style="padding-right: 10px" href="/editbook?bid={{ book.id }}"></a> 35 <a class="glyphicon glyphicon-remove" href="/delbook?bid={{ book.id }}"></a> 36 </td> 37 38 </tr> 39 {% endfor %} 40 </tbody> 41 </table> 42 43 </div> 44 45 {% endblock %} 46 47 {% block script %} 48 $(function () { 49 $("li[class=active]").parent().children().eq(1).addClass("active").siblings().removeClass("active"); 50 }) 51 {% endblock %}
editauthor.html
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container"> 5 <div class="col-md-4"> 6 <h4>編輯做者信息</h4> 7 <form action="/editauthor/?aid={{ author_obj.id }}" method="post"> 8 {% csrf_token %} 9 <div class="form-group"> 10 <label for="author">做者姓名</label> 11 <input type="text" class="form-control" style="margin-bottom: 5px;" id="author" name="aname" value="{{ author_obj.aname }}"> 12 <span class="label label-danger">{{ status }}</span> 13 </div> 14 <div class="form-group"> 15 <button type="submit" class="btn btn-primary">提交</button> 16 </div> 17 </form> 18 </div> 19 20 </div> 21 22 {% endblock %}
editbook.html
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container"> 5 <div class="col-md-4"> 6 <h4>編輯圖書信息</h4> 7 <form action="/editbook/?bid={{ book_obj.id }}" method="post"> 8 {% csrf_token %} 9 <div class="form-group"> 10 <label for="book">書名</label> 11 <input type="text" class="form-control" id="book" name="title" 12 value="{{ book_obj.title }}"> 13 </div> 14 15 <div class="form-group"> 16 <b style="margin-bottom: 5px;display: inline-block">請選擇出版社</b> 17 <select class="form-control" name="pid"> 18 {% for pub in pub_list %} 19 {% if pub.id == book_obj.publisher.id %} 20 <option value="{{ pub.id }}" selected>{{ pub.pname }}</option> 21 {% else %} 22 <option value="{{ pub.id }}">{{ pub.pname }}</option> 23 {% endif %} 24 {% endfor %} 25 </select> 26 </div> 27 28 <div class="form-group"> 29 <label for="date">出版日期</label> 30 <input type="date" class="form-control" id="date" name="pub_date" 31 value="{{ book_obj.publish_date|date:"Y-m-d" }}"> 32 </div> 33 34 <div class="form-group"> 35 <b style="margin-bottom: 5px;display: inline-block">請選擇做者(可多選)</b> 36 <select class="form-control" multiple name="aids"> 37 {% for author in author_list %} 38 {% if author in book_obj.author.all %} 39 <option value="{{ author.id }}" selected>{{ author.aname }}</option> 40 {% else %} 41 <option value="{{ author.id }}">{{ author.aname }}</option> 42 {% endif %} 43 {% endfor %} 44 </select> 45 </div> 46 47 <div class="form-group"> 48 <button type="submit" class="btn btn-primary">提交</button> 49 </div> 50 51 </form> 52 </div> 53 </div> 54 55 {% endblock %}
editpublisher.html
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container"> 5 <div class="col-md-4"> 6 <h4>編輯出版社信息</h4> 7 <form action="/editpublisher/?pid={{ pub_obj.id }}" method="post"> 8 {% csrf_token %} 9 <div class="form-group"> 10 <label for="publisher">出版社名稱</label> 11 <input type="text" class="form-control" style="margin-bottom: 5px;" id="publisher" name="pname" 12 value="{{ pub_obj.pname }}"> 13 <span class="label label-danger">{{ status }}</span> 14 </div> 15 <div class="form-group"> 16 <button type="submit" class="btn btn-primary">提交</button> 17 </div> 18 </form> 19 </div> 20 21 </div> 22 23 {% endblock %}
publisher.html
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container" style="padding-bottom: 5px;"> 5 <a href="/addpublisher/" class="btn btn-info glyphicon glyphicon-plus">添加出版社</a> 6 </div> 7 8 <div class="container"> 9 <table class="table table-striped table-hover"> 10 <thead> 11 <tr> 12 <th>序號</th> 13 <th hidden>出版社ID</th> 14 <th>出版社</th> 15 <th>操做</th> 16 </tr> 17 </thead> 18 <tbody> 19 {% for pub in publisher_list %} 20 <tr> 21 <td>{{ forloop.counter }}</td> 22 <td hidden>{{ pub.id }}</td> 23 <td><a href="/publisher_book?pid={{ pub.id }}">{{ pub.pname }}</a></td> 24 <td> 25 <a class="glyphicon glyphicon-pencil" style="padding-right: 10px" href="/editpublisher?pid={{ pub.id }}"></a> 26 <a class="glyphicon glyphicon-remove" href="/delpublisher?pid={{ pub.id }}"></a> 27 </td> 28 29 </tr> 30 {% endfor %} 31 </tbody> 32 </table> 33 </div> 34 35 {% endblock %} 36 37 {% block script %} 38 $(function () { 39 $("li[class=active]").parent().children().eq(3).addClass("active").siblings().removeClass("active"); 40 }) 41 {% endblock %}
publisher_book.html
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container"> 5 <table class="table table-striped table-hover"> 6 <thead> 7 <tr> 8 <th>序號</th> 9 <th>出版書籍</th> 10 <th>出版社</th> 11 </tr> 12 </thead> 13 <tbody> 14 {% for book in book_list %} 15 <tr> 16 <td>{{ forloop.counter }}</td> 17 <td>{{ book.title }}</td> 18 <td>{{ pname }}</td> 19 20 </tr> 21 {% endfor %} 22 </tbody> 23 </table> 24 25 </div> 26 27 {% endblock %}
index.html
1 {% extends "base.html" %} 2 {% block content %} 3 4 <div class="container"><h2>Welcome to the library management system</h2></div> 5 6 {% endblock %}