zoukankan      html  css  js  c++  java
  • 第六模块-图书管理系统--多表

    作业题目:开发图书增删改查页面

    作业需求:

    
    

     添加书籍界面:

     编辑页面:

     先把数据关系对应好

    在图书管理系统--单表操作的基础上进行修改

    0项目目录:

    数据库采用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

     生成sqlite表:

    在数据库表中预先添加部分数据:

                  {% for books in book_list %}
                            <tr>
    {#         forloop.counter0 类似于 forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。#}

    在项目app01中添加静态文件夹static:引入bootstrap-3.3.7模块

     -----

    代码:

    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
  • 相关阅读:
    HttpContext 来源(System.Web.HttpContext.Current值为null的问题)
    属性" ******** "的代码生成失败.错误是:"程序集"********.Version=1.0.0.0,Culture=neutral,..........无标记为序列化""](转)
    什么是cookie?session和cookie的区别?
    Java中有多少种设计模式?请简单画一下三种常见设计模式的类图?
    Java中抽象类和接口的区别?
    JRE 和 JDK 的区别是什么?
    Hibernate中Criteria的完整用法?
    正则表达式ab?c匹配的字符串是?(B)
    下面forward和redirect的描述,正确的是(ABCD)
    springMVC中的中心控制Servlet是那个类?(B)
  • 原文地址:https://www.cnblogs.com/foremostxl/p/9961076.html
Copyright © 2011-2022 走看看