Models数据表: from django.db import models class Books(models.Model): # 图书ID:默认自动创建,这里手动创建 booksid = models.AutoField(primary_key=True, unique=True, null=False, max_length=11) # 图书种类:如果用默认值就必须得用max_length booksspecies = models.CharField(max_length=6, default='计算机') # 图书名称,null=False:不允许为空值,unique=True:不允许重复 booksname = models.CharField(max_length=16, null=False, unique=True) # 图书几本 booksnumber = models.IntegerField(null=False) # 图书国籍:中国,美国,英国 bookscountry = models.CharField(max_length=4, null=False) # 图书是否入库:默认值没有入库 booksstorage = models.BooleanField(default=False) # 图书价格 booksmoney = models.CharField(max_length=10, null=False) # 添加图书时间:auto_now_add:第一次创建的时候自动设置当前日期,默认值:false bookstimes = models.DateTimeField(auto_now=True) #图书图片名称 booksimg_name=models.CharField(max_length=50, null=False) # 图书图片:upload_to='%Y/%m/%d/icons'每张图片都有自己独立的按时间日期的文件夹,当天上传的图片都放在一个文件夹当中 booksimg = models.FileField(null=True,upload_to='%Y/%m/%d/pic') class Meta: # 更改表名称为Books,如果不更改就是,App名_models类名。 db_table = 'Books'
urls路由:
urlpatterns = [ # django 2.0以下可以直接用url来进行正则表达式传参。2.0以上是直接使用path来进行传参,如果path没有满足传参类型,还可以用re_path()直接使用正则表达式来进行传参 # 传递参数说明: # str- 匹配除路径分隔符之外的任何非空字符串'/'。如果转换器未包含在表达式中,则这是默认值。 # int - 匹配零或任何正整数。返回一个int。 # slug - 匹配由ASCII字母或数字组成的任何slug字符串,以及连字符和下划线字符。例如, building-your-1st-django-site。 # uuid - 匹配格式化的UUID。要防止多个URL映射到同一页面,必须包含短划线并且字母必须为小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。 # path- 匹配任何非空字符串,包括路径分隔符 '/'。这使您可以匹配完整的URL路径,而不仅仅是URL路径的一部分str。 path('getbook/<int:booksid>/', views.get_book, name='get_book'), path('addbook/', views.add_book, name='add_book'), path('delbook/<int:booksid>/', views.del_book, name='del_book'), path('delallbook/', views.del_allbook, name='del_allbook'), path('updatebook/<int:booksid>/', views.update_book, name='update_book'), path('serchbook/<int:booksid>/', views.serch_book, name='serch_book'), ]
views视图:
import os from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.shortcuts import render, redirect from django.urls import reverse from Book.models import Books def get_book(request, booksid): course_list = Books.objects.all().order_by("-booksid") paginator = Paginator(course_list, 10) page = request.GET.get("page", booksid) currentPage = int(page) try: video_list = paginator.page(page) except PageNotAnInteger: video_list = paginator.page(1) except EmptyPage: video_list = paginator.page(paginator.num_pages) return render(request, 'allbooks.html', locals()) def serch_book(request, booksid): if request.method == "GET": name = request.GET.get("booksname") country = request.GET.get("bookscountry") money = request.GET.get("booksmoney") if not name != "" or money != "" or country != "": ob_list = Books.objects.all().order_by("-booksid") if name != "" or money != "" or country != "": ob_list = Books.objects.filter(booksname=name).filter(bookscountry=country).filter( booksmoney=money).order_by("-booksid") if name != "": ob_list = Books.objects.filter(booksname=name).order_by("-booksid") if money != "": ob_list = Books.objects.filter(booksmoney=money).order_by("-booksid") if country != "": ob_list = Books.objects.filter(bookscountry=country).order_by("-booksid") paginator = Paginator(ob_list, 10) page = request.GET.get("page", booksid) currentPage = int(page) try: video_list = paginator.page(page) except PageNotAnInteger: video_list = paginator.page(1) except EmptyPage: video_list = paginator.page(paginator.num_pages) return render(request, 'serchbooks.html', locals()) def add_book(request): if request.method == "GET": return render(request, 'booksadd.html') elif request.method == "POST": booksname = request.POST.get("booksname") booksnumber = request.POST.get("booksnumber") bookscountry = request.POST.get("bookscountry") booksstorage = request.POST.get("booksstorage") booksmoney = request.POST.get("booksmoney") money = format(float(booksmoney), '.2f') booksimg_name = request.POST.get("booksimg_name") booksimg = request.FILES.get("booksimg") # 如果图片名称和图片已与数据表的信息一致将返回添加页面 lists = Books.objects.all() for i in lists: if booksimg_name == i.booksimg_name or booksimg == i.booksimg: return render(request, 'booksadd.html') max_upload_size = 5242880 extenedname = booksimg_name[booksimg_name.rindex('.') + 1:] allowedname = ['jpg', 'png', 'pdf', 'txt', 'zip'] if extenedname not in allowedname or (booksimg.size > max_upload_size): return render(request, 'booksadd.html') # 使用try...except的原因是注册的用户名有可能会一样,except Exception as ex:是捕获所有异常 try: # 第一种保存数据写法: save = Books.objects.create(booksname=booksname, booksnumber=booksnumber, bookscountry=bookscountry, booksstorage=booksstorage, booksmoney=money, booksimg_name=booksimg_name, booksimg=booksimg) # 第二种保存数据写法: # st_save = Books() # st_save.booksname = booksname # st_save.booksnumber = booksnumber # st_save.bookscountry = bookscountry # st_save.booksstorage = booksstorage # st_save.booksmoney = money # st_save.booksimg_name = booksimg_name # st_save.booksimg = booksimg # st_save.save() return redirect(reverse("book:get_book",kwargs={'booksid':1})) except Exception as ex: return redirect(reverse("book:add_book")) def update_book(request, booksid): if request.method == "GET": ob = Books.objects.get(pk=booksid) context = {'data': ob} return render(request, 'booksupdate.html', context) elif request.method == "POST": try: print(booksid) obs = Books.objects.get(pk=booksid) obs.booksname = request.POST['booksname'] obs.booksnumber = request.POST['booksnumber'] obs.bookscountry = request.POST['bookscountry'] obs.booksstorage = request.POST['booksstorage'] obs.booksmoney = format(float(request.POST['booksmoney']), '.2f') obs.booksimg_name = request.POST['booksimg_name'] max_upload_size = 5242880 extenedname = obs.booksimg_name[obs.booksimg_name.rindex('.') + 1:] allowedname = ['jpg', 'png', 'pdf', 'txt', 'zip'] # 判断获取的文件后缀名是否在allowedname中 if extenedname not in allowedname: ob = Books.objects.get(pk=booksid) context = {'data': ob} return render(request, 'booksupdate.html', context) # 如果获取表单文件==None,获取原有数据赋值给obs.booksimg。None是指字段里的值是空白不是null。 if request.FILES.get("booksimg") == None: path_none = str(obs.booksimg) obs.booksimg = path_none obs.save() if request.FILES.get("booksimg") != "": path_null = str(obs.booksimg) obs.booksimg = path_null obs.save() # 再如果获取表单文件的大小大于初始值max_upload_size:将进行返回所有数据重新上传文件 elif request.FILES.get("booksimg").size > max_upload_size: ob = Books.objects.get(pk=booksid) context = {'data': ob} return render(request, 'booksupdate.html', context,) # 再如果获取表单文件!= obs.booksimg原有数据,则进行删除原有目录和文件名,并且把新获取到的目录和文件名进行更新 elif request.FILES.get("booksimg") != obs.booksimg: path_booksimg = 'static/uploads/' + str(obs.booksimg) os.remove(path_booksimg) obs.booksimg = request.FILES.get("booksimg") obs.save() return redirect(reverse('book:get_book',kwargs={'booksid':1})) except Exception as ex: ob = Books.objects.get(pk=booksid) context = {'user': ob} return render(request, 'booksupdate.html', context) def del_book(request, booksid): onedelete = Books.objects.get(pk=booksid) c = onedelete.booksid book = onedelete.booksimg path = 'static/uploads/' + str(book) onedelete.delete() os.remove(path) return redirect(reverse("book:get_book",kwargs={'booksid':1})) def del_allbook(request): if request.method == "GET": return render(request, 'allbooks.html') elif request.method == "POST": ids = request.POST.getlist('booksid') for i in ids: deletesql = Books.objects.get(pk=i) book = deletesql.booksimg path = 'static/uploads/' + str(book) deletesql.delete() os.remove(path) return redirect(reverse('book:get_book',kwargs={'booksid':1}))