django2.2.7+Mysql增、删、改、查、分页、图片上传、截取字符串

setting.py部分代码:

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',
    'Book.apps.BookConfig',
]
DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # },
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        # 数据库引擎
        'NAME': 'bookdate',
        # 数据库名字
        'USER': 'root',
        # 链接数据库用户名
        'PASSWORD': 'Sloveb55555..',
        # 链接数据库密码
        'HOST': '127.0.0.1',
        # 数据库链接地址
        'POST': '3306',
        # 数据库链接端口
    }
}
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/uploads')

---------------------------------------------------------------------------------------------------------------------------

主路由:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/', include(('Book.urls', 'book'), namespace='book')),
]

---------------------------------------------------------------------------------------------------------------------------

__init__.py:代码

import pymysql
pymysql.install_as_MySQLdb()

----------------------------------------------------------------------------------------------------------------------------

分支路由:

urlpatterns = [
    url('getbook/', views.get_book, name='get_book'),
    url('addbook/', views.add_book, name='add_book'),
    url('delbook/', views.del_book, name='del_book'),
    url('delallbook/', views.del_allbook, name='del_allbook'),
    url('updatebook/', views.update_book, name='update_book'),
]

----------------------------------------------------------------------------------------------------------------------------

models.py 数据表

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=30, null=False, unique=True)
    # 图书图片: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'

----------------------------------------------------------------------------------------------------------------------------

views.py 视图

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):
    course_list = Books.objects.all().order_by("booksid")
    paginator = Paginator(course_list, 10)
    page = request.GET.get("page", 1)
    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 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")
        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:
            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()
        except Exception as ex:
            return redirect(reverse("book:add_book"))
        return redirect(reverse("book:get_book"))


def update_book(request):
    if request.method == "GET":
        getbooksid = request.GET.get("booksid")
        ob = Books.objects.get(booksid=getbooksid)
        context = {'data': ob}
        return render(request, 'booksupdate.html', context)
    elif request.method == "POST":
        try:
            postbooksid = request.POST.get("booksid")
            obs = Books.objects.get(booksid=postbooksid)
            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(booksid=postbooksid)
                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(booksid=postbooksid)
                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'))
        except Exception as ex:
            booksid = request.POST.get("booksid")
            ob = Books.objects.get(booksid=booksid)
            context = {'user': ob}
            return render(request, 'booksupdate.html', context)


def del_book(request):
    id = request.GET.get("booksid")
    onedelete = Books.objects.get(booksid=id)
    book = onedelete.booksimg
    path = 'static/uploads/' + str(book)
    onedelete.delete()
    os.remove(path)
    return redirect(reverse("book:get_book"))


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(booksid=i)
            book = deletesql.booksimg
            path = 'static/uploads/' + str(book)
            deletesql.delete()
            os.remove(path)
        return redirect(reverse('book:get_book'))

猜你喜欢

转载自blog.csdn.net/vlking/article/details/105062255