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': '未归还'
                    },
                          ]
            },
        ]
    }

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

相关推荐
飞翔的佩奇1 小时前
【完整源码+数据集+部署教程】表盘指针检测系统源码和数据集:改进yolo11-CA-HSFPN
python·yolo·计算机视觉·数据集·yolo11·表盘指针检测
yangchanghua1111 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance1 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai1 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白2 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务2 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
搏博2 小时前
基于Python3.10.6与jieba库的中文分词模型接口在Windows Server 2022上的实现与部署教程
windows·python·自然语言处理·flask·中文分词
lxmyzzs3 小时前
pyqt5无法显示opencv绘制文本和掩码信息
python·qt·opencv
萧鼎4 小时前
Python pyzmq 库详解:从入门到高性能分布式通信
开发语言·分布式·python
yujkss5 小时前
Python脚本每天爬取微博热搜-终版
开发语言·python