Django图书CRUD系统思维导图

增删改查(CRUD)完整实现流程与课后习题
本思维导图详细展示了Django图书管理系统的完整CRUD实现流程,包含7个主要阶段和课后习题。每个阶段都有详细的代码示例和实现步骤,课后习题帮助巩固学习成果。
1
数据模型
2
URL路由
3
视图函数
4
HTML模板
5
表单类
6
辅助功能
7
测试部署
8
课后习题
Create
创建
Read
读取
Update
更新
Delete
删除
第一阶段:设计数据模型
1
扩展Book模型
在原有的Book模型基础上,添加更多字段和方法,实现完整的图书管理功能。
books/models.py
from django.db import models
from django.urls import reverse
from django.core.validators import MinValueValidator

class Book(models.Model):
    """图书模型"""
    title = models.CharField('书名', max_length=200)
    author = models.CharField('作者', max_length=100)
    publish_date = models.DateField('出版日期')
    isbn = models.CharField('ISBN', max_length=13, unique=True)
    price = models.DecimalField('价格', max_digits=10, decimal_places=2, 
                                validators=[MinValueValidator(0)])
    description = models.TextField('描述', blank=True)
    cover_image = models.ImageField('封面图', upload_to='book_covers/', blank=True, null=True)
    created_at = models.DateTimeField('创建时间', auto_now_add=True)
    updated_at = models.DateTimeField('更新时间', auto_now=True)
    
    def __str__(self):
        return self.title
    
    def get_absolute_url(self):
        """获取图书详情页URL"""
        return reverse('books:book_detail', args=[str(self.id)])

第一阶段检查点

Book模型已正确扩展,包含所有必要字段
媒体文件配置正确,MEDIA_URL和MEDIA_ROOT已设置
数据库迁移成功执行,无错误信息
第二阶段:配置URL路由
1
应用级URL配置
在books应用中创建urls.py文件,配置所有CRUD操作的URL路径。
books/urls.py
from django.urls import path
from . import views

app_name = 'books'  # 命名空间

urlpatterns = [
    # 图书列表页
    path('', views.book_list, name='book_list'),
    
    # 创建图书
    path('create/', views.book_create, name='book_create'),
    
    # 图书详情页
    path('<int:pk>/', views.book_detail, name='book_detail'),
    
    # 更新图书
    path('<int:pk>/update/', views.book_update, name='book_update'),
    
    # 删除图书
    path('<int:pk>/delete/', views.book_delete, name='book_delete'),
]

第二阶段检查点

books/urls.py文件存在且配置完整
所有CRUD操作都有对应的URL路径
第三阶段:实现视图函数
1
列表视图 (book_list)
显示所有图书的列表,支持分页功能。
books/views.py
def book_list(request):
    """图书列表视图"""
    # 获取所有图书
    books_list = Book.objects.all()
    
    # 分页处理
    paginator = Paginator(books_list, 10)  # 每页10条
    page = request.GET.get('page')
    
    try:
        books = paginator.page(page)
    except PageNotAnInteger:
        books = paginator.page(1)
    except EmptyPage:
        books = paginator.page(paginator.num_pages)
    
    context = {
        'books': books,
        'page_obj': books,
    }
    return render(request, 'books/book_list.html', context)

第三阶段检查点

所有视图函数都已实现(列表、详情、创建、更新、删除)
第四阶段:创建HTML模板
1
图书列表模板 (book_list.html)
显示图书列表的模板,包含分页和操作按钮。
books/templates/books/book_list.html
{% extends 'books/base.html' %}

{% block content %}
<h1>图书列表</h1>

{% if books %}
    <table class="table table-hover">
        <thead>
            <tr>
                <th>书名</th>
                <th>作者</th>
                <th>价格</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
        {% for book in books %}
        <tr>
            <td>{{ book.title }}</td>
            <td>{{ book.author }}</td>
            <td>{{ book.price }}</td>
            <td>
                <a href="{% url 'books:book_detail' book.pk %}" class="btn btn-info btn-sm">查看</a>
                <a href="{% url 'books:book_update' book.pk %}" class="btn btn-warning btn-sm">编辑</a>
                <a href="{% url 'books:book_delete' book.pk %}" class="btn btn-danger btn-sm">删除</a>
            </td>
        </tr>
        {% endfor %}
        </tbody>
    </table>
{% endif %}
{% endblock %}

第四阶段检查点

所有CRUD操作都有对应的模板
第五阶段:创建表单类
1
创建BookForm类
创建基于Book模型的ModelForm,用于处理图书的创建和更新。
books/forms.py
from django import forms
from .models import Book

class BookForm(forms.ModelForm):
    """图书表单"""
    
    class Meta:
        model = Book
        fields = ['title', 'author', 'publish_date', 'isbn', 
                  'price', 'description', 'cover_image']

第五阶段检查点

BookForm类已创建,继承自ModelForm
第六阶段:添加辅助功能
1
搜索功能
在模型中添加搜索方法,支持多字段模糊搜索。
books/models.py
@classmethod
def search_books(cls, query):
    """搜索图书"""
    from django.db.models import Q
    return cls.objects.filter(
        Q(title__icontains=query) | 
        Q(author__icontains=query) | 
        Q(isbn__icontains=query) | 
        Q(description__icontains=query)
    ).distinct()

第六阶段检查点

搜索功能实现,支持多字段模糊搜索
第七阶段:测试与部署
1
运行测试
运行Django测试命令,确保所有功能正常。
python manage.py test books # 输出示例: Creating test database for alias 'default'... System check identified no issues (0 silenced). ... ---------------------------------------------------------------------- Ran 8 tests in 0.023s OK Destroying test database for alias 'default'...

第七阶段检查点

所有测试用例通过,无失败测试
第八阶段:课后习题

Django图书CRUD系统课后习题

第一部分:填空题(每空2分,共10分)

1. 在Django中,创建数据迁移文件的命令是:python manage.py __________
2. 在URL配置中,使用__________函数可以包含其他应用的URL配置。
3. 在视图中,使用__________装饰器可以要求用户登录后才能访问。
4. 在模板中,使用{% __________ %}标签可以继承其他模板。
5. 在表单中,处理文件上传需要在<form>标签中添加__________属性。

第二部分:选择题(每题3分,共15分)

6. 在Django中,哪个类用于实现分页功能?
7. 在Book模型中,ISBN字段应该使用哪个字段类型并设置什么属性来保证唯一性?
8. 在视图函数中,使用哪个函数可以获取对象或返回404错误?
9. 在模板中,如何显示来自视图的消息?
10. 在表单验证中,clean_isbn()方法应该返回什么?

第三部分:简答题(每题10分,共20分)

11. 请简述Django中CRUD操作的完整流程,从用户请求到数据库操作的整个过程。
12. 在图书管理系统中,如果需要在图书列表页面添加按价格排序和按作者筛选的功能,请描述实现思路和关键代码。

提交并检查答案