Django图书管理系统项目的搭建

基础配置:

新创一个django项目,取名为homework_book

在setting里进行基础配置

DATABASES={    
    'default':{
        'ENGINE' : 'django.db.backends.mysql',  #连接MYSQL数据库
        'NAME' : 'bookhomework',   #设置连接的库名
        'HOST':'127.0.0.1',         #设置本地连接方式
        'POST':3306,                  #设置端口号
        'USER':'root',                 #以root用户权限登陆数据库
        'PASSWORD':'',              #写入sql数据库登陆密码,没有设置不写
        'OPTIONS':{                  #设置严格模式
    'init_command':'set sql_mode="STRICT_TRANS_TABLES"',
        }
    }
}
(严格模式的设置:当传入一个字符串大于设置本身最大长度字符串时,就会报错,这样不会传入一个截取不了全部的字符) STATIC_URL
= '/static/' #别名设置 ,别名的设置让html文件直接引入改路径,即使别名名称更改,也不要紧 STATICFILES_DIRS=[ os.path.join(BASE_DIR,'statics') ]

在与settings.py文件同级目录下的__init__文件中设置

import pymysql
pymysql.install_as_MySQLdb()

在models.py文件中写入数据,是给数据库中的表格添加数据类型:

from django.db import models   #引入models模块

# Create your models here.
class Book(models.Model):

    name=models.CharField(max_length=32)#设置名字,类型为字符串类型,最大长度为32个字符
    price=models.FloatField()#设置价格,类型为浮点型
    date=models.DateField() #设置时间
    publisher=models.CharField(max_length=32)#设置出版社名称,名字最大长度为32个字节
    

运行manage.py,输入命令,进行数据库表格数据的同步:

makemigrations
migrate

以上两行代码执行成功后,在python中的databases中连接数据库,即可看到连接的库中创建的表格,再在数据库中添加数据就行

在项目文件夹下创建一个statics文件夹,该文件负责存储静态文件,将下载好的bootstrap文件和jquery-3.4.1文件传入其中,为之后的html文件引用用

 在templates文件中创建一个show_books.html文件:

{% load static %}#引入静态文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href=" {% static 'bootstrap/css/bootstrap.min.css' %}">
</head>
<body>

<div class="container-fluid"></div>
<h1>查看书籍</h1>
<div class="row">

    <div class="col-md-8 col-md-offset-2">
    <div><a href="{% url 'add_book' %}"  class="btn btn-primary">添加书籍</a></div>
        <table class=" table table-bordered table-hover table-striped">
            <thead>
            <th>编号</th>
            <th>书籍名称</th>
            <th>价格</th>
            <th>出版日期</th>
            <th>出版社</th>
            <th>操作</th>

            </thead>
            <tbody>
            {% for books_obj in all_books_objs %}
#使用for循环来让数据库中的各行数据逐个调价到表格中
            <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ books_obj.name }}</td>
            <td>{{ books_obj.price }}</td>
            <td>{{ books_obj.date|date:'Y-m-d' }}</td>
#这个时间格式设置是将原本的date格式转换为普通用户也能看懂的格式
            <td>{{ books_obj.publisher }}</td>
            <td><a href="{% url 'edit_book' books_obj.pk %}" class="btn btn-warning">编辑</a>
{#                <a href="/del_book/{{books_obj.pk  }}" class="btn btn-danger">删除</a>#}
                <a href="{% url 'del_book' books_obj.pk %}" class="btn btn-danger">删除</a>
#(两种方法实a标签的跳转,一个是固定格式路径的,一个是引入静态文件的)
            </td>
            </tr>
            {% endfor %}


            </tbody>


        </table>


    </div>
View Code

在urls和views里的配置

urls:
from app01 import views
urlpatterns = [
    url(r'^show_books/', views.show_books,name='show_books'),

views:
from django.shortcuts import render,HttpResponse,redirect
from app01 import models

def show_books(request):
    if request.method=='GET':

        all_book_objs=models.Book.objects.all()
#引入数据库中所有数据的对象

        return render(request,'show_books.html',
                      {'all_books_objs':all_book_objs})
#将对象写入到html文件中去

 效果图:

 此时我们需要做的是点击按钮,做出相应的点击事件,首先配置添加书籍按钮

点击添加书籍按钮的流程步骤:
1.点击添加按钮,跳转到添加书籍信息的网址中
2.写入相关的要添加的书籍的信息
3.点击提交按钮,将添加的信息写入到数据库中
4.再次跳转到查看书籍的网页当中去
5.此时查看书籍调取的是数据库表格中的所有信息,就会将所有的信息展示出来,包括新创建的书籍信息

首先给查看书籍网页中的添加按钮添加一个a标签,让他点击就自动跳转到添加书籍的网页中去

<div><a href="{% url 'add_book' %}"  class="btn btn-primary">添加书籍</a></div>#href里的大括号里的内容代表的是动态引入url网页的意思,add_book网页放的是同级目录下,所以可以直接写文件名,如果想要动态引入的话,在urls.py配置里面也必须添加上相关的
路径名称

 

跳转到add_book网页中,进行相关的网页添加书籍信息配置:

{% load static %}#别名的引入
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
#这个是引入bootstrap文件,利用别名的路径设置

</head>
<body>

<div class="container-fluid"></div>
<h1>添加书籍</h1>
<div class="row">
    <div class="col-md-8 col-md-offset-2">
#创建一个表单格式,提交的按钮请求方式为post方法,提交后路径跳转名称还是为'add_book'
        <form action="{% url 'add_book' %}" method="post" >
            {% csrf_token %}
  <div class="form-group">
    <label for="exampleInputEmail1">书籍名称</label>
    <input type="text" class="form-control" id="exampleInputEmail1" placeholder='书籍名称' name="name">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail2">书籍价格</label>
    <input type="text" class="form-control" id="exampleInputEmail2" placeholder='书籍价格' name="price">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail3">出版日期</label>
    <input type="date" class="form-control" id="exampleInputEmail3" name="date">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail4">出版社</label>
    <input type="text" class="form-control" id="exampleInputEmail4" placeholder='出版社' name="publisher">
  </div>

  <button type="submit" class="btn btn-success  pull-right">Submit</button>
#写入一个button提交按钮
</form>





    </div>



</div>





<script src="{% static 'jquery-3.4.1.js' %}"></script>
<script src="{% static 'bootstrap/js/bootstrap.min.js'%}">
#同样引入bootstrap的js文件
</script>
</body>
</html>
View Code

在urls和views里的配置

urls:
from app01 import views
url(r'^add_book/', views.add_book,name='add_book'),



views:

def add_book(request):
    if request.method=='GET':
        return render(request,'add_book.html')

效果图

设置add_book里的点击按钮事件点击之后就将写入的信息保存到数据库中,设置按钮点击的请求方式为post请求方式,添加views函数的数据

from app01 import models

def add_book(request):
    if request.method=='GET':
        return render(request,'add_book.html')

    else:
#此时的否则就是当为post请求提交时,做出以下操作
        print(request.POST)
#将html文件表单里的内容逐个提取出来,并进行赋值
        # name=request.POST.get('name')
        # price=request.POST.get('price')
        # date=request.POST.get('date')
        # publisher=request.POST.get('publisher')

#第二种方法,获得html表单里的内容,并将以字典的格式展现
        book_info_dict=request.POST.dict()
        print(book_info_dict)
#将字典中多余的键值对删除掉
        del book_info_dict['csrfmiddlewaretoken']
#进行数据库的数据创建,以字典的打散形式进行传输数据,同样实现功能
        models.Book.objects.create(**book_info_dict)

#数据库进行创建新的数据
        # models.Book.objects.create(
        #     name=name,
        #     price=price,
        #     date=date,
        #     publisher=publisher
        # )

#进行页面跳转
        return redirect('show_books')

(最后一步进行网页跳转到show_books网页中,也可以使用return render方式的方法进行,但是如果只传入一个网页,那么里面的每行数据不会体现出来,只会出现一个标题栏,因为并没有将数据库中的全部数据全部提取出来,并进行写入html网页的这步操作,所以才会这样,所以还要加上这一步;
综上所述,直接使用redirect跳转方式可以直接找到数据,建议使用redirect方法)

 

在show_books网页中设置删除按钮和编辑按钮点击事件

 给show_books里的删除按钮增加a标签的跳转功能

<a href="{% url 'del_book' books_obj.pk %}" class="btn btn-danger">删除</a>#跳转的数据为del_book/后面是点击的删除的按钮的id号

urls和views里的配置:urls:

url(r'^del_book/(d+)', views.del_book,name='del_book'),
#此时在这里配置加上数字的正则匹配符,就是获得第几行点击的删除按钮,回来执行函数时,可以直接找到该行数据并进行删除


views:
def del_book(request,n):
#n参数代表的时传入的是第几行数据
    models.Book.objects.filter(pk=n).delete()
#数据库找到关于第几行的数据,并进行删除

return redirect('show_books')

 

 编辑按钮点击事件的内容编辑:

首先在show_books按钮的编辑按钮增加跳转内容

<a href="{% url 'edit_book' books_obj.pk %}" class="btn btn-warning">编辑</a>

编写一个edit_book.html文件

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">

</head>
<body>

<div class="container-fluid"></div>
<h1>修改书籍</h1>
<div class="row">
    <div class="col-md-8 col-md-offset-2">
        <form action="" method="post" >
            {% csrf_token %}
  <div class="form-group">
    <label for="exampleInputEmail1">书籍名称</label>
    <input type="text" class="form-control" id="exampleInputEmail1" placeholder='书籍名称' name="name" value="{{ res.name }}">#设置表格里的内容生成为本行的原来内容
  </div>
  <div class="form-group">
    <label for="exampleInputEmail2">书籍价格</label>
    <input type="text" class="form-control" id="exampleInputEmail2" placeholder='书籍价格' name="price" value="{{ res.price }}">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail3">出版日期</label>
    <input type="date" class="form-control" id="exampleInputEmail3" name="date" value="{{ res.date }}">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail4">出版社</label>
    <input type="text" class="form-control" id="exampleInputEmail4" placeholder='出版社' name="publisher" value="{{ res.publisher }}">
  </div>

  <button type="submit" class="btn btn-success  pull-right">Submit</button>
</form>





    </div>



</div>





<script src="{% static 'jquery-3.4.1.js' %}"></script>
<script src="{% static 'bootstrap/js/bootstrap.min.js'%}"></script>
</body>
</html>
View Code

在urls和views里的配置:

urls:

url(r'^edit_book/(d+)', views.edit_book,name='edit_book'),


views:

def edit_book(request,n):
    if request.method=='GET':
        res=models.Book.objects.get(pk=n)
        return render(request,'edit_book.html' ,{'res':res})
    else:
        book_info_dict=request.POST.dict()
        print(book_info_dict)
        del book_info_dict['csrfmiddlewaretoken']
        models.Book.objects.filter(pk=n).update(**book_info_dict)
        return redirect('show_books')
#如果为get模式请求,则自动推送edit_book.html文件,如果为post请求,则将表单里的内容数据提取出来,找到数据库对应的行数据进行替换,替换完成后进行跳转到show_books网页中去

整体流程图:

原文地址:https://www.cnblogs.com/sikuaiqian/p/10920717.html