3.关于图书表功能

由于在admin.py中的功能较为复杂,我在这里选择分开讲解,我们先讲述图书功能。

那么图书功能分为两个表,作者与图书,我们先给出图书表具体的展示:

python 复制代码
@admin.register(book)
class BookAdmin(ImportExportModelAdmin,AjaxAdmin):
    # 页面上展示的内容
    list_display = ("book_name","author", "book_price", "book_info","book_img", "book_press","book_address", "book_time","book_status")

    # 用于搜索的字段
    search_fields = ("book_name", "book_price", "book_press")

    # 排序字段
    ordering = ("book_price", "book_time")

    #按钮
    actions = ['lend','ret']

我们先给出需要展示的数据中的字段以及我们应该需要的按钮数量,按钮的功能其实我们在一开始的项目创立时就应该理清楚按钮逻辑,在这里两个按钮我分别赋予其lend(上架),ret(下架)两个按钮什么功能呢?

lend:

  • 改变书籍在架状态
  • 判断书籍状态,反馈行为是否成功并给出提示
python 复制代码
 #上架按钮
    def lend(self,request,queryset):
        book = tuple(queryset.filter(book_status="0"))
        if not book:
            return messages.add_message(request=request, level=messages.ERROR, message="已经在架")
        else:
            # 修改为已经借出状态
            queryset.update(book_status="1")
            return messages.add_message(request=request,level=messages.SUCCESS,message="上架成功")
    lend.short_description = '上架'
    lend.icon = 'fas fa-audio-description'
    lend.type = 'warning'

ret:

  • 弹出表单以方便操作数据
  • 如果行为操作成功会自动将信息在借出表中生成一条数据
  • 行为不论是否操作成功都会给出提示
  • 表单中信息可以自动读取到表中数据
python 复制代码
# 下架按钮
    def ret(self, request, queryset):
        #获取弹窗内容
        book_id = request.POST.get("book_id")
        taker_number = request.POST.get("taker_number")
        #转换时间格式
        lend_time1 = request.POST.get("lend_time")
        date_obj1 = datetime.strptime(lend_time1, "%a %b %d %Y %H:%M:%S GMT%z (%Z)")
        lend_time = date_obj1.strftime("%Y-%m-%d %H:%M:%S")
        # 转换时间格式
        back_time1 = request.POST.get("back_time")
        date_obj2 = datetime.strptime(back_time1, "%a %b %d %Y %H:%M:%S GMT%z (%Z)")
        back_time = date_obj2.strftime("%Y-%m-%d %H:%M:%S")

        status = request.POST.get("status")

        #获取书籍
        select_book = book.objects.filter(id=book_id)
        # 获取书籍的状态
        book_status = [i.book_status for i in select_book][0]

        #判断书籍是否已经借阅
        if book_status == '0':
           return JsonResponse(data={'status': 'error',
                                     'msg': '借阅的书籍不能再借阅!'})
        else:
        #用户存在的情况下新增一条借阅记录,修改书籍的借阅状态
           # 查询用户是否存在
            tak = taker.objects.filter(id=taker_number)
            if tak:
                # 修改借出的状态
                book.objects.filter(id=book_id).update(book_status=0)
                # 新增一条借阅记录
                bore.objects.create(#指定写入的顺序与记录来源
                                    bore_taker_name=taker.objects.get(id=taker_number),
                                    bore_book_name=book.objects.get(id=book_id),
                                    bore_lend_time=lend_time,
                                    bore_back_time=back_time,
                                    bore_status=status)
                return JsonResponse(data={
                    'status': 'success',
                    'msg': '借阅成功'
                })
            else:
                return JsonResponse(data={
                'status': 'error',
                'msg': '用户不存在'
            })

    ret.short_description = '下架'
    ret.icon = 'fas fa-audio-description'
    ret.type = 'danger'
    ret.layer = {
        'title': "借阅图书",
        "tips": "借阅图书,注意已经借阅过的图书不能再次借阅",
        "confirm_button": "确认提交",
        "cancel_button": "取消",
        "params": [{
            'type': 'select',
            'key': 'book_id',
            'label': '选择书籍',
            'width': '200px',
            # size对应elementui的size,取值为:medium / small / mini
            'size': 'small',
            # value字段可以指定默认值
            'value': '0',
            'options': get_book()
        },

            {
                'type': 'select',
                'key': 'taker_number',
                'label': '选择学生',
                'width': '200px',
                # size对应elementui的size,取值为:medium / small / mini
                'size': 'small',
                # value字段可以指定默认值
                'value': '0',
                'options': get_taker()
            },
            {
                'type': 'datetime',
                'key': 'lend_time',
                'label': '借出时间',
                'width': '200px',
                # size对应elementui的size,取值为:medium / small / mini
                'size': 'small'
            },
            {
                'type': 'datetime',
                'key': 'back_time',
                'label': '归还时间',
                'width': '200px',
                # size对应elementui的size,取值为:medium / small / mini
                'size': 'small'
            },
            {
                'type': 'select',
                'key': 'status',
                'label': '现在书籍状态',
                'width': '200px',
                # size对应elementui的size,取值为:medium / small / mini
                'size': 'small',
                # value字段可以指定默认值
                'value': '1',
                'options':[{
                    'key':'0',
                    'label':'已归还'
                },
                    {
                        'key': '1',
                        'label': '未归还'
                    },
                          ]
            },
        ]
    }

现在两个按钮功能其实都给出来了,大家可以具体参考,我们现在还应该考虑一个问题,这两个按钮如果不是管理员登录,是不是就应该无法使用,又或者说不会展示给普通用户?如何操作?

相关推荐
这个男人是小帅25 分钟前
【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
PGCCC32 分钟前
【PGCCC】Postgresql 存储设计
数据库·postgresql
PcVue China2 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
Shy9604184 小时前
Doc2Vec句子向量
python·语言模型
锐策4 小时前
〔 MySQL 〕数据库基础
数据库·mysql
远歌已逝5 小时前
管理Oracle实例(二)
数据库·oracle
日月星宿~5 小时前
【MySQL】summary
数据库·mysql
爱吃土豆的程序员6 小时前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie