描述: 图书管理系统简单实现增删改查,实例如下
1. 框架整体目录结构
(1)建立templates,存放html文件
(2)建立statics目录结构,存放js,css,plugins等
(3)配置booksys/urls.py
import pymysql pymysql.install_as_MySQLdb()
2. 连接数据库配置,模块目录,静态文件等配置
主要配置标红的地方
import os DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app1.apps.App1Config', ] 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', ] ROOT_URLCONF = 'booksys.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, "templates")], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'booksys.wsgi.application' # Database # https://docs.djangoproject.com/en/2.2/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NAME':'booksys', 'USER': 'root', # 连接数据库的用户名 'PASSWORD': 'REDHAT', # 连接数据库的密码 'HOST': '127.0.0.1', # IP地址 'POST': 3306, # 端口号 } } # Password validation # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, "statics") ]
3. model文件迁移
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=9, decimal_places=2) pub_date = models.DateField() # 收藏数 临时加字段,设置默认值,防止为空报错行为 keepnum = models.IntegerField(default=100) # 点赞数 临时加字段,设置默认值,防止为空报错行为 zannum = models.IntegerField(default=101) # ForeignKey会生成字段publisher_id实现一对多 publisher = models.ForeignKey("Publish", on_delete=models.CASCADE) # ManyToManyField会创建第三张表Book_authors实现多对多的关系 authors = models.ManyToManyField("Author") class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=32) email = models.CharField(max_length=32) # 打印对象返回的是出版社的名字 def __str__(self): return self.name class Author(models.Model): # books = models.ManyToManyField("Book") name = models.CharField(max_length=32) tel = models.CharField(max_length=32) # OneToOneField会创建一个唯一约束字段ad_id字段实现一对一关系 ad = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE) class AuthorDetail(models.Model): addr = models.CharField(max_length=32) gf = models.CharField(max_length=32)
【modes迁移及数据库配置】
## python manage.py makemigrations ## python manage.py migrate
【查询生成的表结构】:迁移完成查看数据库表结构,数据库数据自行录入
4. 建立增删改查html文件
HTML文件先提前写好,下面有相关html原代码:
【add.html】
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <h3>添加书籍</h3> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form action="/book/add/" method="post"> <div class="form-group"> <label for="title">书籍名称</label> <input type="text" class="form-control" id="title" placeholder="title" name="title"> </div> <div class="form-group"> <label for="price">价格</label> <input type="text" class="form-control" id="price" placeholder="price" name="price"> </div> <div class="form-group"> <label for="date">出版日期</label> <input type="date" class="form-control" id="date" placeholder="date" name="pub_date"> </div> <div class="form-group"> <label for="publisher">出版社</label> <!-- 单选下拉框 --> <select name="publisher_id" id="publisher" class="form-control"> {% for publish in publish_list %} <option value="{{ publish.pk }}">{{ publish.name }}</option> {% endfor %} </select> </div> <div class="form-group"> <label for="authors">作者</label> <!-- multiple 多选下拉框 --> <select name="author_ids" id="authors" class="form-control" multiple> {% for author in author_list %} <option value="{{ author.pk }}">{{ author.name }}</option> {% endfor %} </select> </div> <input type="submit" class="btn btn-success pull-right" value="提交数据1" /> </form> </div> </div> </div> </body> </html>
【delete.html】
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <h3>删除页面</h3> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <table class="table table-striped"> <tbody> <tr> <td>{{ data.title }}</td> <td>{{ data.price }}</td> <td>{{ data.pub_date|date:"Y-m-d" }}</td> <td>{{ data.publisher.name }}</td> <td> {% for author in data.authors.all %} <span class="btn-sm btn-success">{{ author.name }}</span> {% endfor %} </td> </tr> </tbody> </table> <form action="/book/delete/{{ data.pk }}/" method="post"> <button class="btn-danger">确认删除?</button> </form> </div> </div> </div> </body> </html>
【edit.html】
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <h3>编辑书籍</h3> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form action="/book/edit/{{ data.pk }}/" method="post"> <div class="form-group"> <label for="title">书籍名称</label> <input type="text" class="form-control" id="title" placeholder="title" name="title" value="{{ data.title }}"> </div> <div class="form-group"> <label for="price">价格</label> <input type="text" class="form-control" id="price" placeholder="price" name="price" value="{{ data.price }}"> </div> <div class="form-group"> <label for="date">出版日期</label> <input type="date" class="form-control" id="date" placeholder="date" name="pub_date" value="{{ data.pub_date |date:'Y-m-d'}}"> </div> <div class="form-group"> <label for="publisher">出版社</label> <select name="publisher_id" id="publisher" class="form-control"> {% for publish in pulish_list %} {% if data.publisher == publish %} <option value="{{ publish.pk }}" selected>{{ publish.name }}</option> {%else %} <option value="{{ publish.pk }}" >{{ publish.name }}</option> {%endif%} {% endfor %} </select> </div> <div class="form-group"> <label for="authors">作者</label> <select name="author_ids" id="authors" class="form-control" multiple> {% for author in author_list %} {% if author in author_list %} <option value="{{ author.pk }}" selected>{{ 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> </div> </div> </div> </body> </html>
【index.html】首页
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <h3>查看所有书籍</h3> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <a href="/book/add/" class="btn btn-primary">添加书籍</a> <table class="table table-striped"> <thead> <tr> <th>序号</th> <th>书籍名称</th> <th>价格</th> <th>出版日期</th> <th>出版社</th> <th>作者</th> <th>操作</th> </tr> </thead> <tbody> {% for data in book_list %} <tr> <td>{{ forloop.counter }}</td> <td>{{ data.title }}</td> <td>{{ data.price }}</td> <td>{{ data.pub_date |date:'Y-m-d'}}</td> <td>{{ data.publisher.name }}</td> <td> {% for author in data.authors.all %} <span class="btn-sm btn-success"> {{ author.name }} </span> {% endfor %} </td> <td> <a class="btn-sm btn-warning" href="/book/edit/{{ data.pk }}">编辑</a> <a class="btn-sm btn-danger" href="/book/delete/{{ data.pk }}">删除</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </html>
5. url 路由配置
from django.contrib import admin from django.urls import path,re_path from app1 import views urlpatterns = [ path('admin/', admin.site.urls), path('book/index/',views.index), path('book/add/',views.add), # path('book/edit/',views.edit), re_path('book/delete/(d+)/',views.delete), re_path('book/edit/(d+)/',views.edit), ]
6. views文件配置,附有增删改查
from django.shortcuts import render,HttpResponse,redirect from app1.models import Book,Publish,Author,AuthorDetail from django.http import JsonResponse # Create your views here. def index(request): book_list = Book.objects.all() return render(request, "index.html", {"book_list": book_list}) def add(request): if request.method == "GET": publish_list = Publish.objects.all() author_list = Author.objects.all() print(author_list) return render(request, "add.html",{"publish_list":publish_list,"author_list":author_list }) elif request.method == "POST": dic = request.POST.dict() lst = request.POST.getlist("author_ids") dic.pop("author_ids") data = Book.objects.create(**dic) data.authors.add(*lst) res = data.authors.filter().count() if data.id and res: return redirect("/book/index/") else: return HttpResponse("添加失败") # return HttpResponse("add ok") def delete(request,del_id): if request.method == "GET": data = Book.objects.get(pk=del_id) return render(request,"delete.html",{"data":data}) elif request.method == "POST": # 查询单条数据 data = Book.objects.filter(id=del_id) # 删除 , 返回删除的条数 res = data.delete() print(res) if res: return redirect("/book/index/") else: return HttpResponse("删除失败了") def edit(request,edit_id): if request.method == "GET": data = Book.objects.get(pk=edit_id) pulish_list = Publish.objects.all() author_list = Author.objects.all() return render(request, "edit.html", locals()) elif request.method == "POST": dic = request.POST.dict() author_ids = request.POST.getlist("author_ids") dic.pop("author_ids") data = Book.objects.filter(pk=edit_id) res = data.update(**dic) # 简写 print(res) # return HttpResponse("edit ok") data = Book.objects.get(pk=edit_id) data.authors.set(author_ids) res2 = data.authors.filter().count() if res and res2: return redirect("/book/index/") else: return HttpResponse("编辑失败") def index1(request): return render(request, "index1.html") def ajax_sum(request): num1 = request.POST.get("num1") num2 = request.POST.get("num2") ret = {'status': 1, "msg": None} # print(type(num1), num2) total = int(num1) + int(num2) ret['msg'] = total # return HttpResponse(total) return JsonResponse(ret)
7. 测试程序
【增加图书操作】
(1)点击“添加书籍”按钮
(2)出现添加书籍页面,输入相关数据即可,添加成功自动会跳转到首页
【测试delete】
(1)点击任意一个“删除按钮” ---点击777777777书籍的删除按钮
(2)进入一个删除确认按钮
(3)删除成功会跳转到首页,此时首页查询无777777777这本书
【编辑edit】
(1)点击11这本书的编辑按钮
(2)出现1名称书籍的所有编辑书籍信息
(3)修改点击提交书籍即可修改数据完成