
目录
确保已安装以下软件和工具
编译器: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


2376

被折叠的 条评论
为什么被折叠?



