由于在admin.py中的功能较为复杂,我在这里选择分开讲解,我们先讲述图书功能。
那么图书功能分为两个表,作者与图书,我们先给出图书表具体的展示:
@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:
- 改变书籍在架状态
- 判断书籍状态,反馈行为是否成功并给出提示
#上架按钮
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:
- 弹出表单以方便操作数据
- 如果行为操作成功会自动将信息在借出表中生成一条数据
- 行为不论是否操作成功都会给出提示
- 表单中信息可以自动读取到表中数据
# 下架按钮
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': '未归还'
},
]
},
]
}
现在两个按钮功能其实都给出来了,大家可以具体参考,我们现在还应该考虑一个问题,这两个按钮如果不是管理员登录,是不是就应该无法使用,又或者说不会展示给普通用户?如何操作?