第六模塊-圖書管理系統--多表
阿新 • • 發佈:2018-11-15
alt 分發 button 保護 NPU ace tps 選項 views
作業題目:開發圖書增刪改查頁面
作業需求:
1.列出圖書列表、出版社列表、作者列表 2.點擊作者,會列出其出版的圖書列表 3.點擊出版社,會列出旗下圖書列表 4.可以創建、修改、刪除 圖書、作者、出版社
添加書籍界面:
編輯頁面:
先把數據關系對應好
在圖書管理系統--單表操作的基礎上進行修改
數據庫采用pycharm自帶的sqlite
1、創建表結構
一本書對應多個作者,一個作者對應多本書------>書籍和作者多對多的關系
一個出版社對應多本書------->出版社和書籍--一對多的關系
在models.py中建立表結構:
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() 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建立一對多的關系,在健在多的一方(Book)# to=表名 to_field=字段 publish=models.ForeignKey(to=‘Publish‘,to_field=‘nid‘,on_delete=models.CASCADE) # 與Author建立多對多的關系 可以建立在兩個模型中的任意一個,自動創建第三張表 authors=models.ManyToManyField(to=‘Author‘)
數據庫遷移
python manage.py makemigrations
python manage.py migrate
在數據庫表中預先添加部分數據:
{% for books in book_list %} <tr> {# forloop.counter0 類似於 forloop.counter ,但是它是從0計數的。 第一次執行循環時這個變量會被設置為0。#}
在項目中添加靜態文件夾:引入bootstrap-3.3.7模塊
-----
class="form-group"間隔
代碼:
from django.contrib import admin from django.urls import path,re_path,include urlpatterns = [ path(‘admin/‘, admin.site.urls), re_path(r‘^app01/‘,include(‘app01.urls‘)), ]主urls
from app01 import views from django.urls import path,re_path urlpatterns = [ path(‘addbook/‘, views.addbook), path(‘books/‘, views.books),#查看 re_path(r‘books/(\d+)/delete‘, views.delbook),#刪除 delbook(request,id) re_path(r‘books/(\d+)/change‘, views.changebook),#編輯 changebook(request,id) ]從urls.py
from django.shortcuts import render # Create your views here. from django.shortcuts import render,HttpResponse,redirect # Create your views here. from app01.models import Book,Publish,Author def addbook(request): if request.method==‘POST‘: # get--->name="price" title=request.POST.get(‘title‘) price=request.POST.get(‘price‘) pub_date=request.POST.get(‘pub_date‘) publish_id=request.POST.get(‘publish_id‘) # checkbox,select多選 authors_id_list=request.POST.getlist(‘authors_id_list‘) if title == ‘‘ or price == ‘‘ or pub_date == ‘‘ or publish_id == ‘‘ or authors_id_list==‘‘: return HttpResponse(‘<h3 style="color: #c7254e">所有選項不為空</h3>‘) # 添加數據 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(‘/app01/books/‘) publish_list=Publish.objects.all() author_list=Author.objects.all() return render(request,‘addbook.html‘,{‘publish_list‘:publish_list,‘author_list‘:author_list}) def books(request): book_list=Book.objects.all()#[obj1,obj2] return render(request,‘books.html‘,locals()) def delbook(request,id): Book.objects.filter(pk=id).delete() # 刪除成功後做重定向 # 方法一 #return render(request,‘books.html‘) # 方法二 return redirect(‘/app01/books/‘) def changebook(request,id): 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‘) if title == ‘‘ or price == ‘‘ or pub_date == ‘‘ or publish_id == ‘‘ or authors_id_list==‘‘: return HttpResponse(‘<h3 style="color: #c7254e">所有選項不為空</h3>‘) Book.objects.filter(pk=id).update(title=title, price=price, publishDate=pub_date, publish_id=publish_id) # 編輯時使用 book_obj.authors.set(authors_id_list) return redirect(‘/app01/books/‘) publish_list = Publish.objects.all() author_list = Author.objects.all() return render(request,‘changebook.html‘,{‘book_obj‘:book_obj,‘publish_list‘: publish_list, ‘author_list‘: author_list})views.py
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3個meta標簽*必須*放在最前面,任何其他內容都*必須*跟隨其後! --> {% block title %} <title>base</title> {% endblock title %} <!-- Bootstrap --> <link href="/static/bootstrap-3.3.7/css/bootstrap.min.css" rel="stylesheet"> <!-- HTML5 shim 和 Respond.js 是為了讓 IE8 支持 HTML5 元素和媒體查詢(media queries)功能 --> <!-- 警告:通過 file:// 協議(就是直接將 html 頁面拖拽到瀏覽器中)訪問頁面時 Respond.js 不起作用 --> <!--[if lt IE 9]> <script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script> <![endif]--> <link rel="stylesheet" href="/static/base.css"> <style type="text/css"> {% block css %} .container{ margin-top: 100px; } {% endblock %} </style> </head> <body> {% block header %} {% endblock %} <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> {% block con %} {% endblock %} </div> </div> </div> <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依賴 jQuery,所以必須放在前邊) --> <script src="/static/jquery-3.2.1.min.js"></script> <!-- 加載 Bootstrap 的所有 JavaScript 插件。你也可以根據需要只加載單個插件。 --> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </body> </html>base.html
{% extends ‘base.html‘ %} {% block css %} {{ block.super }} {% endblock %} {% block header %} <h3>查看書籍</h3> {% endblock %} {% block con %} {# 路由分發#} <a href="/app01/addbook/" class="btn btn-success pull-left ">添加書籍</a> <table class="table table-striped table-bordered table-hover"> <thead> <tr> <td>編號</td> <td>書籍名單</td> <td>價格</td> <td>出版日期</td> <td>出版社</td> <td>作者</td> <td><strong>操作</strong></td> </tr> </thead> {##} {% for books in book_list %} <tr> <td>{{ forloop.counter }}</td> <td>{{ books.title }}</td> <td>{{ books.price }}</td> <td>{{ books.publishDate|date:‘Y-m-d‘ }}</td> <td>{{ books.publish.name }}</td> {# pk是主鍵的意思#} <td> {% for author in books.authors.all %} {% if forloop.last %} <span>{{ author.name }}</span> {% else %} <span>{{ author.name }}</span> {% endif %} {% endfor %} </td> <td> <a href="/app01/books/{{ books.pk }}/delete" class="btn btn-danger" >刪除</a> <a href="/app01/books/{{ books.pk }}/change" class="btn btn-success" >編輯</a> </td> </tr> {% endfor %} </table> {% endblock %}books.html
{% extends ‘base.html‘ %} {% block css %} {{ block.super }} {% endblock %} {% block header %} <h3>添加書籍</h3> {% endblock %} {% block con %} <button class="btn btn-default center-block">添加書籍</button> <form action="" method="post"> {#這個標簽用於跨站請求偽造保護#} {% csrf_token %} <div class="form-group"> <label for="title">書籍名稱</label> <input type="text" class="form-control" id="title" name="title" > </div> <div class="form-group"> <label for="price">價格</label> <input type="number" class="form-control" id="price" name="price" > </div> <div class="form-group"> <label for="pub_date">出版時間</label> <input type="date" class="form-control" id="pub-date" name="pub_date" > </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 author_list %} <option value="{{ author.pk }}">{{ author.name }}</option> {% endfor %} </select> </div> <button type="submit" class="btn btn-success pull-right">提交</button> </form> {% endblock %}addbook.html
{% extends ‘base.html‘ %} {% block css %} {{ block.super }} {% endblock %} {% block header %} <h4>編輯書籍</h4> {% endblock %} {% block con %} <button class="btn btn-default center-block">編輯書籍</button> <form action="" method="post"> {#這個標簽用於跨站請求偽造保護#} {% csrf_token %} <div class="form-group"> <label for="title">書籍名稱</label> <input type="text" class="form-control" id="title" name="title" value="{{ book_obj.title }}" > </div> <div class="form-group"> <label for="price">價格</label> <input type="number" class="form-control" id="price" name="price" value="{{ book_obj.price }}"> </div> <div class="form-group"> <label for="pub_date">出版時間</label> <input type="date" class="form-control" id="pub-date" name="pub_date" value="{{ 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 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 book_obj.authors.all %} <option selected value="{{ author.pk }}">{{ author.name }}</option> {% else %} <option value="{{ author.pk }}">{{ author.name }}</option> {% endif %} {% endfor %} </select> </div> <button type="submit" class="btn btn-success pull-right">提交</button> </form> {% endblock %}change.html
第六模塊-圖書管理系統--多表