• Django 第九课 【图书管理系统案例】


    目标网络样式

    1:创建项目

    #1.1终端配好相关虚拟环境
    workon [虚拟环境]  
    
    #1.2配置相关库文件
    pip install [库]

    #1.3打开pycharm软件,新建Django项目,选择相关虚拟环境

    2:新建App,进行相关数据接口管理

    #进入终端,进入到这个项目的主目录,里面有manage.py这个文件
    workon django-env #激活虚拟环境
    python manage.py startapp front#(app名称)

    #记得在settings.py 加入front
    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'front'
    ]

    3:布置数据库环境

    #启动Navicat Premium
    1.打开数据库连接
    2.新建数据库
    3.新建数据库表格
    4.编辑定义字段,common+s,保存编辑
    
    #配置settings.py文件
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'book_manager',
            'USER': 'root',
            'PASSWORD': '12345678',
            'HOST': '127.0.0.1',
            'PORT': '3306',
        }
    }
    
    
    #在 __init__.py 处理MySQLdb 在 python3 失效的问题
    import pymysql
    pymysql.install_as_MySQLdb()

    4:建立HTML

     由于公共部分永远有个导航栏在上边,所以这里选用 继承 创建一个 html 模板

    #CSS 公共样式 (在front App内建立static/front文件夹(与app名字一样),方便后期维护查找),定制样式要根据相对的html的标签来写的
    *{
        margin: 0;
        padding: 0;
    }#除去内置的全部间隔样式
    
    .nav{
        background: #3a3a3a;
        height: 65px;
        overflow: hidden;
    }
    
    .nav li{
        float: left;
        list-style: none;
        margin: 0 20px;
        line-height: 65px;
    }
    
    
    .nav li a{
        color: #fff;
        text-decoration: none;
    }#定制标签样式
    
    .nav li a:hover{
        color: lightblue;
    }#鼠标移到字体上时,做出的反应
    
    
    
    #base.html
    
    {% load static %}#加载路径
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>图书管理系统</title>
        <link rel="stylesheet" href="{% static 'front/base.css' %}"> #加载css样式
    </head>
    <body>
         <nav>#导航栏标签
            <ul class="nav">
                <li><a href="/">首页</a></li>
                <li><a href="{% url 'add_book' %}">发布图书</a></li>
            </ul>
        </nav>
    {% block content %}{% endblock %}block 标签所做的的所有事情就是告诉模板引擎: 一个子模板可能会重写父模板的这个部分。(开个小口子)
    </body>
    </html>

    5:编写前端

    5.1 主页

    新建index.html

    {% extends 'base.html' %} #继承

    {% block content %}
    {# <table> 标签定义 HTML 表格。#}
    {#简单的 HTML 表格由 table 元素以及一个或多个 tr、th 或 td 元素组成。#}
    {#tr 元素定义表格行,th 元素定义表头,td 元素定义表格单元。#}
    {#更复杂的 HTML 表格也可能包括 caption、col、colgroup、thead、tfoot 以及 tbody 元素。#}
    <table>
    <thead>
    <tr>
    <th>序号</th>
    <th>书名</th>
    <th>作者</th>
    </tr>
    </thead>
    <tbody>
    {% for book in books %}
    <tr>
    <td>{{ forloop.counter }}</td>
    <td><a href="{% url 'book_detail' book_id=book.0 %}">{{ book.1 }}</a></td> #a标签,点击书名的时候需要跳转的书籍详情页面,并且传递book_id参数
    <td>{{ book.2 }}</td>
    </tr>
    {% endfor %}
    </tbody>
    </table>
    {% endblock %}

    front App的view.py

    from django.shortcuts import render,redirect,reverse
    from django.db import connection
    
    #获取数据库交互对象
    def get_cursor():
        return connection.cursor()
    
    
    def index(request):
        cursor = get_cursor()
        cursor.execute("select id,name,author from book")
        books = cursor.fetchall()#获取所有的数据库books对象
        return render(request, 'index.html', context={"books": books})#context:传递获取的数据库数据

    在url.py 加入url连接

    from django.urls import path
    from  front import views
    
    urlpatterns = [
        path('', views.index, name='index'),
    ]

    5.2 添加书籍

    add_book.html

    {% extends 'base.html' %} #继承

    {% block content %}
    {#<form> 标签用于为用户输入创建 HTML 表单。#}
    {#表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等。#}
    {#表单还可以包含 menus、textarea、fieldset、legend 和 label 元素。#}
    {#表单用于向服务器传输数据。#}
    <form action="" method="post"> # action 规定当提交表单时向何处发送表单数据。
            <table>
    <tbody>
    <tr>
    <td>书名:</td>
    <td><input type="text" name="name"></td>
    </tr>
    <tr>
    <td>作者:</td>
    <td><input type="text" name="author"></td>
    </tr>
    <tr>
    <td></td>
    <td><input type="submit" value="提交"></td>
    </tr>
    </tbody>
    </table>
    </form>
    {% endblock %}

    view.py

    from django.shortcuts import render,redirect,reverse
    from django.db import connection
    
    
    def get_cursor():
        return connection.cursor()
    
    #因为这里其实有俩个页面,一个是刚进来的加载页面,另一个是上传数据的页面,并且需要反转跳转到别的页面
    def add_book(request):
        if request.method == 'GET':
            return render(request, 'add_book.html')
        else:
            name = request.POST.get("name")
            author = request.POST.get("author")
            cursor = get_cursor()
            cursor.execute("insert into book(id,name,author) values(null,'%s','%s')" % (name, author))
            return redirect(reverse('index')) #反转跳转到别的页面,urls.py中需要有定义的name=‘index’

    urls.py

    from django.urls import path
    from  front import views
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('add_book/', views.add_book, name='add_book'),
    ]

    5.3 书籍详情

    book_detail.html

    {% extends 'base.html' %}
    
    {% block content %}
         <p>书名: {{ book.1 }}</p>
         <p>作者: {{ book.2 }}</p>
        <form action="{% url 'delete_book' %}" method="post"> #点击跳转
            <input type="hidden" name="book_id" value="{{ book.0 }}">
            <input type="submit" value="删除按钮">
        </form>
    {% endblock %}

    views.py

    from django.shortcuts import render,redirect,reverse
    from django.db import connection
    
    
    def get_cursor():
        return connection.cursor()
    
    def book_detail(request, book_id):
        cursor = get_cursor()
        cursor.execute("select id,name,author from book where id=%s" % book_id)
        book = cursor.fetchone()
    
        return render(request, 'book_detail.html', context={"book": book})

    urls.py

    from django.urls import path
    from  front import views
    
    urlpatterns = [
    #需要将其他页面(index.html)的book_id参数传递给views.book_detail页面
        path('book_detail/<int:book_id>/', views.book_detail, name='book_detail'),
    ]

    5.4 删除书籍

    因为删除书籍不需要展示页面,直接删除后跳转到主页面,所以不需要html,只需要在views.py执行方法

    from django.urls import path
    from  front import views
    
    urlpatterns = [
        path('delete_book/', views.delete_book, name='delete_book'),
    ]

    views.py

    from django.shortcuts import render,redirect,reverse
    from django.db import connection
    
    
    def get_cursor():
        return connection.cursor()
    
    
    def delete_book(request):
        if request.method == 'POST':
            book_id = request.POST.get('book_id')
            cursor = get_cursor()
            cursor.execute("delete from book where id = %s" % book_id)
            return redirect(reverse('index'))
        else:
            raise RuntimeError("删除图书的method错误") #若没有数据,则返回错误

    最后注意,因为相关网站没有进行CSRF认证,所以需要暂时在settings.py中,将下面的CSRF认证屏蔽掉

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
  • 相关阅读:
    Sphinx 自动化文档
    手把手教你用Rancher创建产品质量数据库设置
    手把手教你用Rancher创建产品质量数据库设置
    手把手教你用Rancher创建产品质量数据库设置
    九、新人成才之路《成才大原则 谈人生大规划》
    九、新人成才之路《成才大原则 谈人生大规划》
    九、新人成才之路《成才大原则 谈人生大规划》
    九、新人成才之路《成才大原则 谈人生大规划》
    Linux常用命令大全(非常全!!!)
    Linux常用命令大全(非常全!!!)
  • 原文地址:https://www.cnblogs.com/nelsen-chen/p/9487713.html
Copyright © 2020-2023  润新知