1. 程式人生 > >第六模塊-圖書管理系統--多表

第六模塊-圖書管理系統--多表

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(rbooks/(\d+)/delete, views.delbook),#刪除 delbook(request,id)
    re_path(rbooks/(\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

第六模塊-圖書管理系統--多表