基于Django的Python Web图书管理系统完整开发过程记录

目录

1.创建虚拟环境

2.进入虚拟环境

3.安装Django

4.创建Django项目

5.进入项目

6.创建app

7.配置注册应用

8.定义模型及配置数据库连接

9.模块功能实现

9.1图书管理

9.1.2 创建管理员账号(Superuser)

9.1.3 将Book注册到后台中

9.1.4 视图函数创建

9.1.5 静态资源准备及配置

9.1.6 模板开发创建

9.1.7 URL路由设计开发

9.1.8 测试运行

9.2读者管理

9.2.1 视图函数创建

9.2.2 模板开发创建

9.2.3 URL路由设计开发

9.2.4 测试运行


确保已安装以下软件和工具

编译器:Python 

IDE工具:Pycharm

1.创建虚拟环境

python -m venv .venv

2.进入虚拟环境

.venv\Scripts\activate.bat

3.安装Django

pip install django

如果慢的话使用国内镜像

pip install django -i Simple Index

4.创建Django项目

django-admin startproject mylibrary

5.进入项目

cd mylibrary

6.创建app

django-admin startapp app01

7.配置注册应用

Django中的应用必修注册才能被使用,打开mylibrary/settings.py,将app01应用添加到INSTALLED_APPS中:

8.定义模型及配置数据库连接

通过定义模型,我们可以描述应用程序中存储的数据模型,包括数据字段的名称、类型和关系等。Django可以根据模型中的字段定义,自动创建数据库表,并提供了一套完整的数据访问API,使得可以轻松地执行创建、读取、更新和删除(CRUD)操作。

定义模型

根据我们前文提供的表结构在如下文件app01/models.py 中创建的Django模型如下:

from django.contrib.auth.models import User
from django.db import models

# Create your models here.
# 书籍信息表
class Book(models.Model):
    book_id = models.AutoField(primary_key=True, verbose_name='书号')
    book_name = models.CharField(max_length=255, verbose_name='书名')
    author = models.CharField(max_length=255, verbose_name='作者')
    publisher = models.CharField(max_length=255, verbose_name='出版社')
    publish_date = models.DateField(verbose_name='出版日期')
    ISBN = models.CharField(max_length=13, unique=True, verbose_name='ISBN号')
    stock_quantity = models.IntegerField(verbose_name='库存数量')
    category = models.CharField(max_length=255, verbose_name='类别')

    def __str__(self):
        return self.book_name

    # 读者信息表


class Reader(models.Model):
    reader_id = models.AutoField(primary_key=True, verbose_name='读者证号')
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='用户')
    name = models.CharField(max_length=255, verbose_name='姓名')
    gender = models.CharField(max_length=10, verbose_name='性别')
    age = models.IntegerField(verbose_name='年龄')
    affiliation = models.CharField(max_length=255, verbose_name='所属单位')
    contact_info = models.CharField(max_length=255, verbose_name='联系方式')

    def __str__(self):
        return self.name

    # 借阅记录表


class BorrowRecord(models.Model):
    borrow_id = models.AutoField(primary_key=True, verbose_name='借阅编号')
    reader = models.ForeignKey(Reader, on_delete=models.CASCADE, verbose_name='读者')
    book = models.ForeignKey(Book, on_delete=models.CASCADE, verbose_name='书籍')
    borrow_date = models.DateField(verbose_name='借阅日期')
    due_date = models.DateField(verbose_name='应还日期')
    return_date = models.DateField(null=True, blank=True, verbose_name='实际还书日期')

    def __str__(self):
        return f"{self.reader.name} - {self.book.book_name}"

makemigrations命令会检查你的模型更改,并为这些更改创建迁移文件。

migrate命令则会应用这些迁移,创建或修改数据库中的表。

9.模块功能实现

在Django中实现详细的功能核心需要如下四类Python文件:

模型(Models):定义数据结构和数据库表。模型是Django ORM(对象关系映射)的基础,用于描述数据库中的表以及表之间的关系。

视图(Views):处理Web请求并返回响应。视图函数或类负责接收HTTP请求,执行相应的逻辑处理(如数据查询、验证等),然后返回HTML页面、JSON数据或其他类型的响应。

模板(Templates):用于生成HTML页面。Django的模板系统允许开发者使用特定的模板语法来动态生成HTML内容,使得页面渲染更加灵活和可维护。

URL配置:用于将URL路径映射到相应的视图函数或类。URL配置使得开发者可以灵活地定义Web应用程序的路由规则。

另外还有两类文件非必须,但是也是Django特有能有效提高开发效率的文件:

表单(Forms):用于处理用户在Web页面上输入的数据。表单类可以定义输入字段、验证规则等,使得数据处理更加便捷和安全。

管理界面(Admin):Django提供了强大的自动化管理界面,允许开发者通过浏览器对数据库进行增删改查操作。每个应用都可以定义自己的管理模型和方法,以扩展或自定义管理界面的功能。

前面我们已经完成了模型Model的创建,接下来我们视图(Views),模板(Templates),URL配置分别实现各个模块的详细完整功能。

9.1图书管理

为了更方便快捷进行测试数据的录入,我们先引入admin管理界面,只需要些少量代码,就可以实现强大的功能。

9.1.2 创建管理员账号(Superuser)

管理员账号(Superuser)是可以进入网站后台,对数据进行维护的账号,具有很高的权限。这里我们需要创建一个管理员账号,以便添加后续的测试数据。

输入python manage.py createsuperuser指令,创建管理员账号:

9.1.3 将Book注册到后台中

接下来我们需要“告诉”Django,后台中需要添加Book这个数据表供管理。

打开library/admin.py,写入以下代码:

from django.contrib import admin

# Register your models here.
from .models import Book
# 注册Book模型到admin后台
admin.site.register(Book)

重新启动 server

python manage.py runserver

在浏览器输入: http://127.0.0.1:8000/admin/

输入管理员用户名和密码登录后台

add一条book记录:

9.1.4 视图函数创建

我们分别创图书信息的增删改查的视图函数,为了便于理解和修改,我们不使用Django的Form模块。

在以下文件中创建视图函数View:mylibrary/app01/views.py

create_book

from django.contrib.auth import authenticate, login, logout
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.shortcuts import render, redirect
from .models import Book

def create_book(request):
    if request.method == 'POST':
        book_name = request.POST.get('book_name')
        author = request.POST.get('author')
        publisher = request.POST.get('publisher')
        publish_date = request.POST.get('publish_date')
        ISBN = request.POST.get('ISBN')
        stock_quantity = request.POST.get('stock_quantity')
        category = request.POST.get('category')

        # 创建书籍
        Book.objects.create(
            book_name=book_name,
            author=author,
            publisher=publisher,
            publish_date=publish_date,
            ISBN=ISBN,
            stock_quantity=stock_quantity,
            category=category
        )
        return redirect('book_list')  # 重定向到书籍列表页
    return render(request, 'book/create_book.html')
  • 当接收到一个 HTTP POST 请求时,这个函数会从请求中获取表单数据(如书名、作者等)。
  • 然后,它使用这些数据创建一个新的 Book 对象,并保存到数据库中。
  • 创建成功后,用户将被重定向到书籍列表页面。
  • 如果请求不是 POST 方法,则渲染一个用于创建新书籍的表单页面。

2.book_detail(request, book_id):

from django.shortcuts import render, get_object_or_404

def book_detail(request, book_id):
    book = get_object_or_404(Book, pk=book_id)
    return render(request, 'book/book_detail.html', {'book': book})
  • 这个函数通过提供的 book_id 查找对应的书籍记录。
  • 如果找到该书籍,就渲染一个展示书籍详细信息的页面。
  • 如果没有找到对应书籍,则返回 404 错误。

3.update_book(request, book_id):

def update_book(request, book_id):
    book = get_object_or_404(Book, pk=book_id)
    print(book.book_id)
    if request.method == 'POST':
        book.book_name = request.POST.get('book_name')
        book.author = request.POST.get('author')
        book.publisher = request.POST.get('publisher')
        book.publish_date = request.POST.get('publish_date')
        book.ISBN = request.POST.get('ISBN')
        book.stock_quantity = request.POST.get('stock_quantity')
        book.category = request.POST.get('category')

        # 保存更新
        book.save()
        return redirect('book_detail', book_id=book.book_id)

    return render(request, 'book/update_book.html', {'book': book})
  • 根据给定的 book_id 获取书籍对象。
  • 如果请求方法是 POST,那么它会更新书籍对象的信息,并将其保存回数据库。
  • 更新完成后,用户将被重定向到显示该书籍详情的页面。
  • 如果请求不是 POST 方法,则渲染一个包含当前书籍信息的表单页面,允许用户进行修改。

4.delete_book(request, book_id):

def delete_book(request, book_id):
    book = get_object_or_404(Book, pk=book_id)
    if request.method == 'POST':
        book.delete()
        return redirect('book_list')
    return render(request, 'book/delete_book.html', {'book': book})
  • 同样根据 book_id 获取书籍对象。
  • 如果请求方法是 POST,那么书籍对象将被从数据库中删除。
  • 删除完成后,用户将被重定向到书籍列表页面。
  • 如果请求不是 POST 方法,则渲染一个确认删除的页面。

4.book_list(request):

def book_list(request):
    query = request.GET.get('q', '')  # 获取搜索关键词
    books = Book.objects.filter(book_name__icontains=query) if query else Book.objects.all()

    # 分页逻辑
    paginator = Paginator(books, 1)  # 每页显示10本书
    page = request.GET.get('page', 1)

    try:
        books_page = paginator.page(page)
    except PageNotAnInteger:
        books_page = paginator.page(1)  # 如果页码不是整数,返回第一页
    except EmptyPage:
        books_page = paginator.page(paginator.num_pages)  # 超过范围时返回最后一页

    context = {
        'books': books_page,
        'query': query
    }
    return render(request, 'book/book_list.html', context)
  • 显示所有书籍的列表,支持分页和搜索功能。
  • 它可以从查询参数中获取搜索关键词 q,并据此过滤书籍列表。
  • 使用 Django 的 Paginator 来处理分页逻辑。
  • 最后,渲染一个包含书籍列表的页面,并传递必要的上下文信息(如书籍列表和搜索关键词)。

9.1.5 静态资源准备及配置

为了使这些视图能够正常工作,需要在项目的模板目录下有相应的 HTML 文件,然后在 Django 的 URL 配置文件中映射到特定的 URL 路径上,以便用户可以通过浏览器访问它们。

开发模板文件之前我们先准备下静态资源。

在项目根目录下新建一个文件夹static用于存放前端模板静态资源。

把我们准备好的文件复制到static文件夹

准备好静态资源后,我们还需要在Django中指定静态文件的存放位置,这样才能够在模板中正确引用它们。

mylibrary/settings.py 中进行如下配置:


STATIC_URL = 'static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),  # 添加此项
]

9.1.6 模板开发创建

在创建模板之前,我们先在根目录下新建一个文件夹templates用于存放我们的所有的模板文件。

模板位置也同样需要进行配置指定模板的存放位置,在mylibrary/settings.py 中进行如下配置:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 添加此项
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.te
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李威威wiwi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值