zoukankan      html  css  js  c++  java
  • 图书管理系统

    数据库配置相关代码

    数据库配置

    /settings.py

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',
    ]
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'bookmanager2',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'USER': 'root',
            'PASSWORD': '123',
        }
    }
    
    STATIC_URL = '/static/'
    
    # 静态文件的实际存放目录
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),
    ]
    

    /bookmanager/__init__.py

    import pymysql
    
    pymysql.install_as_MySQLdb()
    

    /app01/models.py

    from django.db import models
    
    # Create your models here.
    
    
    class User(models.Model):
        id = models.AutoField(primary_key=True)   # -> 创建一个自增的ID列作为主键
        email = models.CharField(max_length=24)  # -> varchar(32)
        pwd = models.CharField(max_length=16)  # -> varchar(32)
    
        def __str__(self):
            return self.email
    
    
    # 出版社表
    class Press(models.Model):
        id = models.AutoField(primary_key=True)  # id主键
        name = models.CharField(max_length=32)  # 出版社名称
    
        def __str__(self):
            return '<这是一个出版社对象,它的名字是:{}>'.format(self.name)
    
    
    # 书
    class Book(models.Model):
        id = models.AutoField(primary_key=True)  # 自增id主键
        title = models.CharField(max_length=30)  # 书名
        price = models.IntegerField(null=True)
        # Django 1.11 默认就是级联删除, Django 2.0之后必须指定on_delete
        # to=关联的表名
        press = models.ForeignKey(to='Press', on_delete=models.CASCADE)
    
    # 作者
    class Author(models.Model):
        id = models.AutoField(primary_key=True)  # 自增id主键
        name = models.CharField(max_length=32)  # 作者名字
        books = models.ManyToManyField(to='Book')  # 只是ORM层面建立的一个多对多关系,不是作者表的一个字段
    
        def __str__(self):
            return self.name
    

    前端页面之母版

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <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标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <meta name="description" content="">
        <meta name="author" content="">
        <link rel="icon" href="https://v3.bootcss.com/favicon.ico">
        <title>Dashboard Template for Bootstrap</title>
        <!-- Bootstrap core CSS -->
        <link href="/static/bootstrap-3.3.7/css/bootstrap.css" rel="stylesheet">
        <!-- 当前页面用到的自定义样式 -->
        <link href="/static/dashboard.css" rel="stylesheet">
    </head>
    
    <body>
    
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container-fluid">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
                        aria-expanded="false" aria-controls="navbar">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Project name</a>
            </div>
            <div id="navbar" class="navbar-collapse collapse">
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="#">Dashboard</a></li>
                    <li><a href="#">Settings</a></li>
                    <li><a href="#">Profile</a></li>
                    <li><a href="#">Help</a></li>
                </ul>
                <form class="navbar-form navbar-right">
                    <input class="form-control" placeholder="Search..." type="text">
                </form>
            </div>
        </div>
    </nav>
    
    <div class="container-fluid">
        <div class="row">
            <div class="col-sm-3 col-md-2 sidebar">
                <ul class="nav nav-sidebar">
                    <li class="{% block press %} {% endblock %}"><a href="/press_list/">出版社列表</a></li>
                    <li class="{% block book %} {% endblock %}"><a href="/book_list/">书籍列表</a></li>
                    <li class="{% block author %} {% endblock %}"><a href="/author_list/">作者列表</a></li>
                </ul>
            </div>
            <div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2 main">
                {% block content %}
    
                {% endblock %}
            </div>
        </div>
    </div>
    
    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="/static/jquery-3.3.1.js"></script>
    <script src="/static/bootstrap-3.3.7/js/bootstrap.js"></script>
    </body>
    </html>
    

    图书管理系统之出版社的增删改查


    表结构设计

    出版社
    id  name 
    
    作者
    id  name  
    
    书
    id  title 出版社_id
    
    作者_书_关系表
    id 书_id 作者_id
    

    ORM版增删改查

    类名.objects.all()		    	  --> 拿到所有的数据(列表)
    类名.objects.filter()              --> 拿到符合条件的数据(列表)
    类名.objects.get()                 --> 有且只能有一个返回结果(对象)
    类名.objects.create(name='')       --> 创建一个对象,返回的就是刚创建的对象
    类名.objects.filter(id=).delete()  --> 删除
    				
    obj = 类名.objects.get(id='')
    obj.name = '新值'                  --> 修改对象的属性(修改数据行某个字段的值)
    obj.save()                         --> 把修改同步到数据库
    	
    

    代码实现


    后端业务逻辑

    /bookmanager/urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^press_list/', views.press_list),
        url(r'^add_press/', views.add_press),
        url(r'^delete_press/', views.delete_press),
        url(r'^edit_press/', views.edit_press),
    ]
    

    /app01/views.py

    def press_list(request):
        press_obj = Press.objects.all().order_by('id')
        return render(request, 'list/press_list.html', locals())
    
    def add_press(request):
        if request.method == 'POST':
            name = request.POST.get('name')
            Press.objects.create(name=name)
            return redirect('/press_list/')
        return render(request, 'add/add_press2.html')
    
    
    def  delete_press(request):
        delete_id = request.GET.get('id')
        Press.objects.filter(id=delete_id).delete()
    
        return redirect('/press_list/')
    
    
    def edit_press(request):
        id = request.GET.get('id')
        press_obj = Press.objects.get(id=id)
    
        if request.method == 'POST':
            new_name = request.POST.get('name')
            press_obj.name = new_name
            press_obj.save()
            return redirect('/press_list/')
    
        return render(request, 'edit/edit_press2.html', {'name': press_obj.name, 'edit_id': press_obj.id})
    

    前端页面展示


    /templates/list/press_list.html

    {% extends 'list/base.html' %}
    {% block press %}
    active
    {% endblock %}
    {% block content %}
     <h1 class="page-header">出版社列表</h1>
    
                <!--面板 开始-->
                <div class="panel panel-default">
                    <div class="panel-heading">出版社列表</div>
                    <div class="panel-body">
                        <!--表格上面的那一行-->
                        <div class="row">
                            <div class="col-md-4">
                                <div class="input-group">
                                    <input type="text" class="form-control" placeholder="Search for...">
                                    <span class="input-group-btn">
                          <button class="btn btn-default" type="button">Go!</button>
                        </span>
                                </div><!-- /input-group -->
                            </div><!-- /.col-lg-6 -->
                            <div class="col-md-1 pull-right">
                                <a class="btn btn-success pull-right" href="/add_press/">添加</a>
                            </div>
                        </div>
                        <!--表格上面那一行 结束-->
                        <!--表格 开始-->
                        <div class="table-box">
                            <table class="table table-bordered table-striped">
                                <thead>
                                <tr>
                                    <th class="text-center">序号</th>
                                    <th class="text-center">出版社id</th>
                                    <th class="text-center">出版社名字</th>
                                    <th class="text-center">操作</th>
                                </tr>
                                </thead>
                                <tbody>
                                {% for i in press_obj %}
                                    <tr class="text-center">
                                        <td>{{ forloop.counter }}</td>
                                        <td>{{ i.id }}</td>
                                        <td>{{ i.name }}</td>
                                        <td>
                                            <a class="btn btn-danger btn-sm" href="/delete_press/?id={{ i.id }}">删除</a>
                                            <a class="btn btn-info btn-sm"href="/edit_press/?id={{ i.id }}">编辑</a>
                                        </td>
                                    </tr>
                                {% endfor %}
                                </tbody>
                            </table>
                        </div>
                        <!--表格 结束-->
                        <!--分页开始-->
                        <div>
                            <nav aria-label="Page navigation" class="pull-right">
                                <ul class="pagination">
                                    <li>
                                        <a href="#" aria-label="Previous">
                                            <span aria-hidden="true">&laquo;</span>
                                        </a>
                                    </li>
                                    <li><a href="#">1</a></li>
                                    <li><a href="#">2</a></li>
                                    <li><a href="#">3</a></li>
                                    <li><a href="#">4</a></li>
                                    <li><a href="#">5</a></li>
                                    <li>
                                        <a href="#" aria-label="Next">
                                            <span aria-hidden="true">&raquo;</span>
                                        </a>
                                    </li>
                                </ul>
                            </nav>
                        </div>
                        <!--分页结束-->
                    </div>
                </div>
                <!--面板 结束-->
    
    {% endblock %}
    

    /templates/add/add_press.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-Type" charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
        <title>添加出版社</title>
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div class="page-header">
                    <h1>添加出版社</h1>
                </div>
                <form class="form-horizontal" action="/add_press/" method="post">
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="press_name" class="col-sm-3 control-label">出版社名称</label>
                        <div class="col-sm-9">
                            <input type="text" class="form-control" id="press_name" name="name" placeholder="出版社名称">
                        </div>
                    </div>
    
                    <div class="form-group">
                        <div class="col-sm-offset-3 col-sm-9">
                            <button type="submit" class="btn btn-default">添加</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    
    
    </body>
    </html>
    

    /templates/edit/edit_press.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-Type" charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
        <title>添加出版社</title>
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div class="page-header">
                    <h1>编辑出版社</h1>
                </div>
                <form class="form-horizontal" action="/edit_press/?id={{ edit_id }}" method="post">
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="press_name" class="col-sm-3 control-label">出版社名称</label>
                        <div class="col-sm-9">
                            <input type="text" class="form-control" id="press_name" name="name" value="{{ name }}">
                        </div>
                    </div>
    
                    <div class="form-group">
                        <div class="col-sm-offset-3 col-sm-9">
                            <button type="submit" class="btn btn-default">确认修改</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    
    
    </body>
    </html>
    

    图书管理系统之书籍的增删改查


    书籍表结构设计

    		1. id  title 出版社_id
    		2. SQL
    			create table book (
    				id int primary key auto_increment,
    				title varchar(30) not null,
    				press_id int not null,
    				constraint fk_press foreign key(press_id) references press(id) 
    				on delete cascade
    				on update cascade
    			)
    		3. ORM外键
    			press = models.ForignKey(to='Press', on_delete=models.CASCADE)
    

    书籍的增删改查

    1. 查询
    			1. book_obj.press              --> ORM层面封装的,返回的是和我这本书关联的出版社对象
    			2. book_obj.press_id           --> 数据库中真正存在的字段,保存的是和我关联的出版社id值
    
    2. 增加
    			1. 用select标签把已经存在的出版社在页面上展示出来
    			   让用户去选择
    			   使用的是:模板语言的for循环
          
    <select name="press_id" class="form-control">
                            {% for press in press_data %}
                                <option value="{{ press.id }}">{{ press.name }}</option>
                            {% endfor %}
                        </select>
    
    3. 删除
    			类名.objects.filter(id=).delete()
    			补充一个3秒钟之后跳转到指定页面的操作
    				1. location.href
    				2. setTimeout()
    				3. setinterval()		
    
    4. 编辑 
          obj = 类名.objects.get(id='')
          obj.name = '新值'       --> 修改对象的属性(修改数据行某个字段的值)
          obj.save()              --> 把修改同步到数据库
          
    			用select标签展示默认的出版社
          <select name="press_id" class="form-control">
                            {% for press in press_list %}
                                <option value="{{ press.id }}">{{ press.name }}</option>
                            {% endfor %}
                        </select>
    

    代码实现



    后端业务逻辑

    /bookmanager/urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^press_list/', views.press_list),
        url(r'^add_press/', views.add_press),
        url(r'^delete_press/', views.delete_press),
        url(r'^edit_press/', views.edit_press),
    
    
        url(r'^book_list/', views.book_list),
        url(r'^add_book/', views.add_book),
        url(r'^delete_book/', views.delete_book),
        url(r'^edit_book/', views.edit_book),
    
    ]
    

    /app01/views.py

    from django.shortcuts import render, redirect
    
    # Create your views here.
    
    from .models import Press, Book
    
    def book_list(request):
        book_obj = Book.objects.all()
    
        return render(request, 'list/book_list.html', locals())
    
    def add_book(request):
        press_data = Press.objects.all()
        if request.method == 'POST':
            book_name = request.POST.get('book_name')
            press_id = request.POST.get('press_id')
            Book.objects.create(title=book_name, press_id=press_id)
            return redirect('/book_list/')
    
        return render(request, 'add/add_book.html', locals())
    
    
    def delete_book(request):
        delete_id = request.GET.get('id')
        Book.objects.filter(id=delete_id).delete()
        return render(request, 'delete/delete_success.html')
    
    
    def edit_book(request):
        edit_id = request.GET.get('id')
        book_obj = Book.objects.get(id=edit_id)
        press_data = Press.objects.all()
        if request.method == 'POST':
            new_name = request.POST.get('book_name')
            press_id = request.POST.get('press_id')
            book_obj.title = new_name
            book_obj.press_id = press_id
            book_obj.save()
            return redirect('/book_list/')
    
        return render(request, 'edit/edit_book.html', {'book_name': book_obj.title, 'edit_id': edit_id, 'press_list': press_data})
    

    前端页面展示


    /templates/list/book_list.html

    {% extends 'list/base.html' %}
    {% block book %}
    active
    {% endblock %}
    {% block content %}
     <h1 class="page-header">书籍列表</h1>
    
                <!--面板 开始-->
                <div class="panel panel-default">
                    <div class="panel-heading">书籍列表</div>
                    <div class="panel-body">
                        <!--表格上面的那一行-->
                        <div class="row">
                            <div class="col-md-4">
                                <div class="input-group">
                                    <input type="text" class="form-control" placeholder="Search for...">
                                    <span class="input-group-btn">
                          <button class="btn btn-default" type="button">Go!</button>
                        </span>
                                </div><!-- /input-group -->
                            </div><!-- /.col-lg-6 -->
                            <div class="col-md-1 pull-right">
                                <a class="btn btn-success pull-right" href="/add_book/">添加</a>
                            </div>
                        </div>
                        <!--表格上面那一行 结束-->
                        <!--表格 开始-->
                        <div class="table-box">
                            <table class="table table-bordered table-striped">
                                <thead>
                                <tr>
                                    <th class="text-center">序号</th>
                                    <th class="text-center">书籍id</th>
                                    <th class="text-center">书籍名称</th>
                                    <th class="text-center">出版社名称</th>
                                    <th class="text-center">操作</th>
                                </tr>
                                </thead>
                                <tbody>
                                {% for i in book_obj %}
                                    <tr class="text-center">
                                        <td>{{ forloop.counter }}</td>
                                        <td>{{ i.id }}</td>
                                        <td>{{ i.title }}</td>
                                        <td>{{ i.press.name }}</td>
                                        <td>
                                            <a class="btn btn-danger btn-sm" href="/delete_book/?id={{ i.id }}">删除</a>
                                            <a class="btn btn-info btn-sm"href="/edit_book/?id={{ i.id }}">编辑</a>
                                        </td>
                                    </tr>
                                {% endfor %}
                                </tbody>
                            </table>
                        </div>
                        <!--表格 结束-->
                        <!--分页开始-->
                        <div>
                            <nav aria-label="Page navigation" class="pull-right">
                                <ul class="pagination">
                                    <li>
                                        <a href="#" aria-label="Previous">
                                            <span aria-hidden="true">&laquo;</span>
                                        </a>
                                    </li>
                                    <li><a href="#">1</a></li>
                                    <li><a href="#">2</a></li>
                                    <li><a href="#">3</a></li>
                                    <li><a href="#">4</a></li>
                                    <li><a href="#">5</a></li>
                                    <li>
                                        <a href="#" aria-label="Next">
                                            <span aria-hidden="true">&raquo;</span>
                                        </a>
                                    </li>
                                </ul>
                            </nav>
                        </div>
                        <!--分页结束-->
                    </div>
                </div>
                <!--面板 结束-->
    {% endblock %}
    

    /templates/add/add_book.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-Type" charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
        <title>添加书籍</title>
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div class="page-header">
                    <h1>添加书籍</h1>
                </div>
                <form class="form-horizontal" action="/add_book/" method="post">
                {% csrf_token %}
                    <div class="form-group">
                        <label for="press_name" class="col-sm-3 control-label">书籍名称</label>
                        <div class="col-sm-9">
                            <input type="text" class="form-control" id="book_name" name="book_name" placeholder="书籍名称">
                        </div>
                    </div>
    
                     <div class="form-group">
                        <label for="press_name" class="col-sm-3 control-label">出版社名称</label>
                        <div class="col-sm-9">
                            <select name="press_id" class="form-control">
                            {% for press in press_data %}
                                <option value="{{ press.id }}">{{ press.name }}</option>
                            {% endfor %}
                        </select>
                        </div>
                    </div>
    
                    <div class="form-group">
                        <div class="col-sm-offset-3 col-sm-9">
                            <button type="submit" class="btn btn-default">添加</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    
    
    </body>
    </html>
    

    删(跳转页面)

    /templates/delete/delete_success.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-Type" charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    </head>
    <body>
    
    <p>删除书籍成功, <span id="s1">3</span>秒钟之后跳转回书籍列表页面!</p>
    
    </body>
    <script>
        // 每隔一秒钟就修改s1的text
        var currentNum = document.getElementById('s1').innerText;
        // setInterval(需要做的事情也就是代码段或者是函数,间隔时间)
        // 这样一个对象生成之后需要做一个赋值操作,建立引用和实例之间的联系
        var t2 = setInterval(function () {
            currentNum = document.getElementById('s1').innerText;
            document.getElementById('s1').innerText = currentNum - 1;
            if (currentNum == 1) {
                clearInterval(t2);
                location.href = '/book_list/';
            }
        }, 1000);
    </script>
    </html>
    

    /templates/edit/edit_book.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-Type" charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
        <title>编辑书籍</title>
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div class="page-header">
                    <h1>编辑书籍</h1>
                </div>
                <form class="form-horizontal" action="/edit_book/?id={{ edit_id }}" method="post">
                {% csrf_token %}
                    <div class="form-group">
                        <label for="press_name" class="col-sm-3 control-label">书籍名称</label>
                        <div class="col-sm-9">
                            <input type="text" class="form-control" id="book_name" name="book_name" value="{{ book_name }}">
                        </div>
                    </div>
    
                     <div class="form-group">
                        <label for="press_name" class="col-sm-3 control-label">出版社名称</label>
                        <div class="col-sm-9">
                            <select name="press_id" class="form-control">
                            {% for press in press_list %}
                                <option value="{{ press.id }}">{{ press.name }}</option>
                            {% endfor %}
                        </select>
                        </div>
                    </div>
    
                    <div class="form-group">
                        <div class="col-sm-offset-3 col-sm-9">
                            <button type="submit" class="btn btn-default">确认修改</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    
    
    </body>
    </html>
    

    注意


    ORM变更表结构

    ORM修改表结构的时候,执行 python3 manager.py makemigration 时候出来俩选项

     1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
     2) Quit, and let me add a default in models.py
    

    为什么?

    给数据库中已经存在的表添加另外一个字段,这个字段既没有默认值也不能为空
    ORM就不知道数据库中已经存在的数据该怎么处理这个字段


    选项1 是直接在 makemigration跳转到相应的界面自定义默认值, 然后直接执行 migrate命令完成数据库表结构的变更

    manage.py@bookmanager > makemigrations
    bash -cl "/usr/local/bin/python3.6 /Applications/PyCharm.app/Contents/helpers/pycharm/django_manage.py makemigrations /Users/cjw/Desktop/bookmanager"
    Tracking file by folder pattern:  migrations
    You are trying to add a non-nullable field 'price' to book without a default; we can't do that (the database needs something to populate existing rows).
    Please select a fix:
     1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
     2) Quit, and let me add a default in models.py
    Select an option:  1
    Please enter the default value now, as valid Python
    The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
    Type 'exit' to exit this prompt
    >>> 
    

    选项2 则是退出 makemigration界面, 去models.py中定义相关的字段属性, 完成后回来重新执行 makemigration, 然后再执行migrate


    图书管理系统之作者的增删改查


    作者表结构设计


    1. SQL版
    				-- 创建作者表
    				create table author(
    					id int primary key auto_increment,
    					name varchar(32) not null
    				);
    				
    				-- 创建作者和书的关系表
    				create table author2book(
    					id int primary key auto_increment,
    					author_id int not null,
    					book_id int not null,
    					constraint fk_author foreign key (author_id) references author(id) on delete cascade on update cascade,
    					constraint fk_book foreign key (book_id) references book(id) on delete cascade on update cascade
    				);
    
    
    2. ORM版
    				1. 第一版:
    					自己创建第三张表
        
    				2. 第二版
    					让ORM帮我们创建第三张表
    					models.ManyToManyField()
    

    作者表与书籍表的增删改查


     author_obj = Author.objects.all()
    
    1. 查询
    			author_obj.books        --> 得到的只是一个关联关系,并不能拿到数据
    			author_obj.books.all()  --> 得到和我这个作者关联的所有书籍对象列表
    
    2. 添加
          author_obj.books.add()  --> 对author_obj这个对象追加外键字段books的值, 传入的值是单列数据类型
          author_obj.books.set()   --> 对author_obj这个对象重新添加外键字段books的值, 传入的值是列表或元组
        
    3. 删除
    			Author.objects.filter(id=delete_id).delete()
      
    3. 编辑
          author_obj.name = author_name
          author_obj.save()
          author_obj.books.set(book_ids)
    

    代码实现

    后端业务逻辑

    /bookmanager/urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^press_list/', views.press_list),
        url(r'^add_press/', views.add_press),
        url(r'^delete_press/', views.delete_press),
        url(r'^edit_press/', views.edit_press),
    
    
        url(r'^book_list/', views.book_list),
        url(r'^add_book/', views.add_book),
        url(r'^delete_book/', views.delete_book),
        url(r'^edit_book/', views.edit_book),
    
        url(r'author_list/', views.author_list),
        url(r'add_author/', views.add_author),
        url(r'delete_author/', views.delete_author),
        url(r'edit_author/', views.edit_author)
    
    ]
    

    /app01/views.py

    from django.shortcuts import render, redirect
    
    # Create your views here.
    
    from .models import Press, Book, Author
    
    
    def author_list(request):
        author_obj = Author.objects.all()
        return render(request, 'list/author_list.html', locals())
    
    
    def add_author(request):
        book_list = Book.objects.all()
    
        if request.method == "POST":
            author_name = request.POST.get('author_name')
            book_ids = request.POST.getlist('book_ids')  # request.POST.get 只能获取一个值, request.POST.getlist 能获取多个值, 用列表保存
            author_obj = Author.objects.create(name=author_name)
            author_obj.books.add(*book_ids)  # 参数是一个一个单独的书籍id值
            # author_obj.books.set(book_ids)  # 参数是书籍id值的列表
            return redirect('/author_list/')
    
    
        return render(request, 'add/add_author.html', locals())
    
    
    def delete_author(request):
        delete_id = request.GET.get('id')
        Author.objects.filter(id=delete_id).delete()
        return redirect('/author_list/')
    
    
    def edit_author(request):
        edit_id = request.GET.get('id')
        author_obj = Author.objects.get(id=edit_id)
        book_list = Book.objects.all()
    
        if request.method == 'POST':
            author_name = request.POST.get('author_name')
            book_ids = request.POST.getlist('book_ids')
            author_obj.name = author_name
            author_obj.save()
            author_obj.books.set(book_ids)
    
            return redirect('/author_list/')
    
        return render(request, 'edit/edit_author.html', locals())
    

    前端页面展示

    /templates/list/author_list.html

    {% extends 'list/base.html' %}
    {% block author %}
    active
    {% endblock %}
    {% block content %}
      <h1 class="page-header">作者列表</h1>
    
                <!--面板 开始-->
                <div class="panel panel-default">
                    <div class="panel-heading">作者列表</div>
                    <div class="panel-body">
                        <!--表格上面的那一行-->
                        <div class="row">
                            <div class="col-md-4">
                                <div class="input-group">
                                    <input type="text" class="form-control" placeholder="Search for...">
                                    <span class="input-group-btn">
                          <button class="btn btn-default" type="button">Go!</button>
                        </span>
                                </div><!-- /input-group -->
                            </div><!-- /.col-lg-6 -->
                            <div class="col-md-1 pull-right">
                                <a class="btn btn-success pull-right" href="/add_author/">添加</a>
                            </div>
                        </div>
                        <!--表格上面那一行 结束-->
                        <!--表格 开始-->
                        <div class="table-box">
                            <table class="table table-bordered table-striped">
                                <thead>
                                <tr>
                                    <th class="text-center">序号</th>
                                    <th class="text-center">作者id</th>
                                    <th class="text-center">作者名字</th>
                                    <th class="text-center">所著书籍</th>
                                    <th class="text-center">操作</th>
                                </tr>
                                </thead>
                                <tbody>
                                {% for i in author_obj %}
                                    <tr class="text-center">
                                        <td>{{ forloop.counter }}</td>
                                        <td>{{ i.id }}</td>
                                        <td>{{ i.name }}</td>
                                        <td>
                                            {% for foo in i.books.all %}
                                                {% if forloop.last %}
                                                《{{ foo.title }}》
                                                   {% else %}
                                                    《{{ foo.title }}》,
                                                {% endif %}
                                               {% empty %}
                                                暂无作品
                                            {% endfor %}
    
                                        </td>
                                        <td>
                                            <a class="btn btn-danger btn-sm" href="/delete_author/?id={{ i.id }}">删除</a>
                                            <a class="btn btn-info btn-sm"href="/edit_author/?id={{ i.id }}">编辑</a>
                                        </td>
                                    </tr>
                                {% endfor %}
                                </tbody>
                            </table>
                        </div>
                        <!--表格 结束-->
                        <!--分页开始-->
                        <div>
                            <nav aria-label="Page navigation" class="pull-right">
                                <ul class="pagination">
                                    <li>
                                        <a href="#" aria-label="Previous">
                                            <span aria-hidden="true">&laquo;</span>
                                        </a>
                                    </li>
                                    <li><a href="#">1</a></li>
                                    <li><a href="#">2</a></li>
                                    <li><a href="#">3</a></li>
                                    <li><a href="#">4</a></li>
                                    <li><a href="#">5</a></li>
                                    <li>
                                        <a href="#" aria-label="Next">
                                            <span aria-hidden="true">&raquo;</span>
                                        </a>
                                    </li>
                                </ul>
                            </nav>
                        </div>
                        <!--分页结束-->
                    </div>
                </div>
                <!--面板 结束-->
    {% endblock %}
    

    /templates/add/add_author.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-Type" charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
        <title>添加书籍</title>
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div class="page-header">
                    <h1>添加作者</h1>
                </div>
                <form class="form-horizontal" action="/add_author/" method="post">
                {% csrf_token %}
                    <div class="form-group">
                        <label for="author_name" class="col-sm-3 control-label">作者名字</label>
                        <div class="col-sm-9">
                            <input type="text" class="form-control" id="author_name" name="author_name" placeholder="作者名字">
                        </div>
                    </div>
    
                     <div class="form-group">
                        <label for="press_name" class="col-sm-3 control-label">书籍列表</label>
                        <div class="col-sm-9">
                            <select name="book_ids" class="form-control" multiple="multiple">
                            {% for book in book_list %}
                                <option value="{{ book.id }}">{{ book.title }}</option>
                            {% endfor %}
                        </select>
                        </div>
                    </div>
    
                    <div class="form-group">
                        <div class="col-sm-offset-3 col-sm-9">
                            <button type="submit" class="btn btn-default">添加</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    
    
    </body>
    </html>
    

    /templates/edit/edit_author.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-Type" charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
        <title>编辑作者</title>
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div class="page-header">
                    <h1>编辑作者</h1>
                </div>
                <form class="form-horizontal" action="/edit_author/?id={{ edit_id }}" method="post">
                {% csrf_token %}
                    <div class="form-group">
                        <label for="author_name" class="col-sm-3 control-label">作者名字</label>
                        <div class="col-sm-9">
                            <input type="text" class="form-control" id="author_name" name="author_name" value="{{ author_obj.name }}">
                        </div>
                    </div>
    
                     <div class="form-group">
                        <label for="press_name" class="col-sm-3 control-label">书籍名字</label>
                        <div class="col-sm-9">
                            <select name="book_ids" class="form-control" multiple="multiple">
                            {% for book in book_list %}
                                <option value="{{ book.id }}">{{ book.title }}</option>
                            {% endfor %}
                        </select>
                        </div>
                    </div>
    
                    <div class="form-group">
                        <div class="col-sm-offset-3 col-sm-9">
                            <button type="submit" class="btn btn-default">确认修改</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    
    
    </body>
    </html>
    

    代码下载

    gitee仓库

    代码下载

  • 相关阅读:
    html bottom html submit按钮表单控件与CSS美化
    Extjs4.0以上版本智能提示的方法
    Delete from join 用法
    vs2015开发Windows服务
    -bash: Chmod: command not found
    使用OpenPop.dll开发读取POP3邮件程序
    邮箱学堂:SPF详解
    js中escape对应的C#解码函数 UrlDecode
    json字符串CSS格式化
    Sql server not in优化
  • 原文地址:https://www.cnblogs.com/cjwnb/p/11688848.html
Copyright © 2011-2022 走看看