You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django图书馆管理系统图书借出归还功能实现及报错解决咨询

Django图书馆管理系统借出/归还功能问题修复方案

问题1:图书借阅逻辑缺失修复

原代码问题

  • 未做库存校验,库存为0时仍可发起借阅
  • 未同步更新Book模型的quantity库存字段
  • 创建BookIssue记录时quantity错误设置为0,不符合实际借阅数量
  • 重复定义了两次bookIssueView函数,且第一个函数结尾缺少redirect的闭合右括号

修复后代码

def bookIssueView(request, id):
    book = get_object_or_404(Book, id=id)
    # 先校验库存
    if book.quantity <= 0:
        messages.error(request, "该图书库存不足,无法借阅")
        return redirect("book_list") # 跳转到图书列表页,可替换为自己的路由名
    # 库存减1并保存
    book.quantity -= 1
    # 可选:库存为0时自动更新状态为不可借
    if book.quantity == 0:
        book.status = "Unavailable" # 需和你定义的BOOK_STATUS选项对应
    book.save()
    # 创建借阅记录,默认借阅1本
    book_issue = BookIssue.objects.create(
        book=book, 
        reader=request.user.reader, 
        quantity=1
    )
    messages.info(request, "图书借阅成功")
    return redirect("book_issue_list")

问题2:图书归还功能报错+逻辑实现修复

报错原因

ConnectionDoesNotExist报错是数据库配置错误导致的:你项目settings.py的DATABASES配置项中,错误添加了名为Django For Pro的数据库连接别名,而代码操作数据库时指定了这个不存在的别名。

修复方法

打开项目settings.py文件,找到DATABASES配置块,检查所有连接键名,将错误的Django For Pro键名删除或修改为正确的别名,默认使用default即可。
示例正确配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

归还功能逻辑实现

你当前定义的BookReturn模型用多对多关联不符合业务逻辑,无需单独建归还表,直接基于BookIssue借阅记录实现归还即可,参考代码如下:

def bookReturnView(request, issue_id):
    # 找到对应借阅记录
    book_issue = get_object_or_404(BookIssue, id=issue_id, reader=request.user.reader)
    # 对应图书库存加1
    book = book_issue.book
    book.quantity += 1
    # 库存从0变1时更新状态为可借
    if book.quantity == 1:
        book.status = "Available"
    book.save()
    # 删除借阅记录(也可以给BookIssue加is_returned布尔字段标记为已归还,方便留存历史记录)
    book_issue.delete()
    messages.info(request, "图书归还成功")
    return redirect("book_issue_list")

可选模型优化

建议给BookIssue模型加归还标记,替代删除记录的操作,方便后续统计借阅历史:

class BookIssue(models.Model):
    reader = models.ForeignKey(Reader, on_delete=models.CASCADE)
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    issue_date = models.DateField(auto_now_add=True)
    return_date = models.DateField(default=get_expiry_date)
    quantity = models.IntegerField(default=1)
    is_returned = models.BooleanField(default=False) # 新增字段

内容的提问来源于stack exchange,提问作者Zokhid Abdullaev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:18:02