基于Django的二手交易系统毕业设计:从零搭建全栈Web项目

发布时间:2026/9/2 5:41:30
基于Django的二手交易系统毕业设计:从零搭建全栈Web项目 大家好我是专注于分享实战开发经验的博主。临近毕业季很多计算机专业的同学都在为毕业设计发愁选题既要体现技术深度又要能独立完成还要有实际应用价值。如果你正在寻找一个能综合运用Web开发、数据库设计、前后端交互的选题那么一个基于Django框架的二手物品交易系统会是一个非常不错的选择。它不仅贴合“循环经济”的热点还能让你完整实践从需求分析、系统设计、编码实现到部署上线的全流程。本文将为你详细拆解这个毕业设计的核心实现方案。无论你是Django新手还是有一定Python基础想挑战完整项目的同学都能从零开始一步步搭建起一个功能完备的二手交易平台。我们将涵盖用户认证、商品管理、订单处理、搜索等核心模块并提供清晰的代码示例和避坑指南确保你的项目既有“面子”完整功能也有“里子”清晰的代码结构。1. 项目背景与核心价值1.1 为什么选择二手交易系统在众多毕业设计选题中电商类系统一直是经典之选。而二手交易系统相较于标准电商有其独特的挑战和亮点业务复杂度适中它包含了用户系统、商品CRUD、订单流程、支付集成或模拟、搜索、聊天等典型电商功能但规则如定价、成色描述更灵活适合展示你的业务建模能力。技术栈全面可以覆盖Django MTV模式、ORM数据库操作、用户认证与权限控制、静态文件处理、前后端模板渲染、简单的AJAX交互等Web开发核心技能。现实意义强“闲鱼”、“转转”等平台的普及让评委老师更容易理解你的项目价值也便于你进行竞品分析和功能设计。1.2 为什么选择Django框架Django是一个高级Python Web框架以其“开箱即用”和“功能齐全”著称非常适合快速构建稳健的毕业设计项目。自带电池内置了强大的ORM、后台管理界面、用户认证系统、表单处理、安全防护等让你无需从零造轮子。开发效率高清晰的MTVModel-Template-View架构使代码组织有序易于理解和维护。社区活跃遇到问题容易找到解决方案丰富的第三方包如Django REST framework用于构建API为项目扩展提供了可能。1.3 系统核心功能概述一个完整的二手物品交易系统通常包含以下模块用户模块注册、登录、登出、个人信息管理、头像上传。商品模块发布商品标题、描述、图片、价格、分类、成色、编辑、下架、删除、商品列表展示、商品详情页。交易模块加入购物车可选、生成订单、订单状态管理待付款、待发货、待收货、已完成、模拟支付流程。沟通模块买家与卖家之间的站内信或简单聊天功能。搜索与筛选模块根据关键词、分类、价格区间搜索商品。后台管理模块利用Django Admin对用户、商品、订单进行管理。2. 开发环境与项目初始化2.1 环境准备在开始编码前请确保你的开发环境已就绪。操作系统Windows 10/11, macOS, 或 Linux (如Ubuntu) 均可。Python推荐使用 Python 3.8 至 3.11 版本。Django 对高版本Python支持良好但需注意第三方包的兼容性。包管理工具使用pip进行Python包管理。建议使用虚拟环境隔离项目依赖。2.2 创建虚拟环境与安装Django打开终端或命令提示符按步骤操作# 1. 为项目创建一个新目录并进入 mkdir secondhand_trading_system cd secondhand_trading_system # 2. 创建Python虚拟环境 (以venv为例) python -m venv venv # 3. 激活虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # 4. 安装Django (这里安装一个长期支持版本) pip install django4.22.3 创建Django项目与应用Django项目由一个“项目”配置和多个“应用”组成。我们的交易系统可以拆分为核心应用。# 1. 创建Django项目项目名为 config (或 secondhand) django-admin startproject config . # 2. 创建核心应用例如 market python manage.py startapp market # 3. 创建用户应用用于扩展Django自带的用户模型 python manage.py startapp accounts2.4 初始项目结构执行上述命令后你的项目结构应如下所示secondhand_trading_system/ │ ├── venv/ # 虚拟环境目录通常加入.gitignore ├── manage.py # Django命令行工具入口 ├── config/ # 项目配置目录 │ ├── __init__.py │ ├── settings.py # 项目配置文件非常重要 │ ├── urls.py # 项目根URL路由 │ └── wsgi.py │ ├── market/ # 核心市场应用 │ ├── migrations/ # 数据库迁移文件 │ ├── __init__.py │ ├── admin.py # 后台管理配置 │ ├── apps.py │ ├── models.py # 数据模型定义核心 │ ├── tests.py │ ├── views.py # 视图函数/类核心 │ └── views.py │ └── accounts/ # 用户账户应用 ├── migrations/ ├── __init__.py ├── admin.py ├── apps.py ├── models.py └── ...2.5 基础配置编辑config/settings.py文件进行初步配置# config/settings.py # 将新创建的应用添加到 INSTALLED_APPS INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, # 本地应用 accounts, market, ] # 配置数据库默认使用SQLite适合开发和毕业设计演示 DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite3, } } # 配置静态文件URL和目录用于存放CSS, JS, 图片 STATIC_URL static/ STATICFILES_DIRS [BASE_DIR / static] # 开发阶段存放静态文件的目录 STATIC_ROOT BASE_DIR / staticfiles # 生产环境收集静态文件的目录 # 配置媒体文件URL和目录用于用户上传的商品图片、头像 MEDIA_URL /media/ MEDIA_ROOT BASE_DIR / media # 设置语言和时区 LANGUAGE_CODE zh-hans # 中文 TIME_ZONE Asia/Shanghai USE_I18N True USE_TZ True # 自定义用户模型重要 AUTH_USER_MODEL accounts.CustomUser # 我们将在accounts应用中创建它3. 数据模型设计数据模型是系统的基石。我们需要设计几个核心模型用户、商品分类、商品、订单。3.1 扩展用户模型Django自带的User模型字段有限我们通常需要扩展。在accounts/models.py中创建自定义用户模型。# accounts/models.py from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): 自定义用户模型扩展基础字段 # 增加手机号、头像等字段 phone_number models.CharField(max_length15, blankTrue, verbose_name手机号) avatar models.ImageField(upload_toavatars/, blankTrue, nullTrue, verbose_name头像) address models.TextField(blankTrue, verbose_name收货地址) class Meta: verbose_name 用户 verbose_name_plural verbose_name def __str__(self): return self.username注意首次创建自定义用户模型后必须在首次执行makemigrations之前就在settings.py中设置AUTH_USER_MODEL。3.2 设计商品相关模型在market/models.py中定义商品分类和商品模型。# market/models.py from django.db import models from django.conf import settings class Category(models.Model): 商品分类 name models.CharField(max_length100, uniqueTrue, verbose_name分类名称) parent models.ForeignKey(self, on_deletemodels.CASCADE, nullTrue, blankTrue, related_namechildren, verbose_name父分类) is_active models.BooleanField(defaultTrue, verbose_name是否有效) class Meta: verbose_name 商品分类 verbose_name_plural verbose_name ordering [name] def __str__(self): return self.name class Item(models.Model): 商品/物品 CONDITION_CHOICES [ (new, 全新), (like_new, 几乎全新), (good, 状况良好), (fair, 有使用痕迹), (poor, 需要维修), ] seller models.ForeignKey(settings.AUTH_USER_MODEL, on_deletemodels.CASCADE, related_nameitems_for_sale, verbose_name卖家) title models.CharField(max_length200, verbose_name商品标题) description models.TextField(verbose_name商品描述) category models.ForeignKey(Category, on_deletemodels.SET_NULL, nullTrue, related_nameitems, verbose_name分类) price models.DecimalField(max_digits10, decimal_places2, verbose_name价格) condition models.CharField(max_length20, choicesCONDITION_CHOICES, defaultgood, verbose_name成色) image models.ImageField(upload_toitem_images/, blankTrue, nullTrue, verbose_name主图) is_sold models.BooleanField(defaultFalse, verbose_name是否已售出) is_active models.BooleanField(defaultTrue, verbose_name是否上架) created_at models.DateTimeField(auto_now_addTrue, verbose_name创建时间) updated_at models.DateTimeField(auto_nowTrue, verbose_name更新时间) class Meta: verbose_name 商品 verbose_name_plural verbose_name ordering [-created_at] def __str__(self): return f{self.title} - ¥{self.price}3.3 设计订单模型订单模型关联买家、卖家和商品。# market/models.py (续) class Order(models.Model): 订单模型 STATUS_CHOICES [ (pending, 待付款), (paid, 已付款), (shipped, 已发货), (completed, 已完成), (cancelled, 已取消), ] order_number models.CharField(max_length50, uniqueTrue, verbose_name订单号) buyer models.ForeignKey(settings.AUTH_USER_MODEL, on_deletemodels.CASCADE, related_nameorders_bought, verbose_name买家) item models.ForeignKey(Item, on_deletemodels.PROTECT, related_nameorders, verbose_name商品) # 下单时的快照信息防止商品信息变更影响订单 snapshot_title models.CharField(max_length200, verbose_name商品标题快照) snapshot_price models.DecimalField(max_digits10, decimal_places2, verbose_name商品价格快照) snapshot_image models.CharField(max_length500, blankTrue, verbose_name商品图片快照路径) status models.CharField(max_length20, choicesSTATUS_CHOICES, defaultpending, verbose_name订单状态) total_amount models.DecimalField(max_digits10, decimal_places2, verbose_name总金额) shipping_address models.TextField(verbose_name收货地址) buyer_note models.TextField(blankTrue, verbose_name买家留言) created_at models.DateTimeField(auto_now_addTrue, verbose_name创建时间) updated_at models.DateTimeField(auto_nowTrue, verbose_name更新时间) class Meta: verbose_name 订单 verbose_name_plural verbose_name ordering [-created_at] def __str__(self): return self.order_number def save(self, *args, **kwargs): 在保存订单前自动生成订单号并保存商品快照 if not self.order_number: # 简单的订单号生成逻辑时间戳随机数 import time, random self.order_number fORD{int(time.time())}{random.randint(1000,9999)} if not self.snapshot_title and self.item: self.snapshot_title self.item.title self.snapshot_price self.item.price if self.item.image: self.snapshot_image self.item.image.url super().save(*args, **kwargs)3.4 生成并应用数据库迁移模型定义好后需要将其同步到数据库。# 1. 为所有应用生成迁移文件 python manage.py makemigrations # 2. 查看生成的SQL语句可选用于检查 python manage.py sqlmigrate market 0001 python manage.py sqlmigrate accounts 0001 # 3. 应用迁移创建数据库表 python manage.py migrate执行成功后SQLite数据库文件db.sqlite3会被创建里面包含了我们定义的所有表结构。4. 后台管理配置Django Admin是一个强大的内置后台非常适合毕业设计中进行数据管理。4.1 注册模型到Admin首先在accounts/admin.py和market/admin.py中注册我们的模型。# accounts/admin.py from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import CustomUser class CustomUserAdmin(UserAdmin): 自定义用户后台管理界面 model CustomUser # 在用户列表页显示的字段 list_display [username, email, phone_number, is_staff] # 在用户编辑页分组显示的字段 fieldsets UserAdmin.fieldsets ( (None, {fields: (phone_number, avatar, address)}), ) admin.site.register(CustomUser, CustomUserAdmin)# market/admin.py from django.contrib import admin from .models import Category, Item, Order admin.register(Category) class CategoryAdmin(admin.ModelAdmin): list_display (name, parent, is_active) list_filter (is_active,) search_fields (name,) admin.register(Item) class ItemAdmin(admin.ModelAdmin): list_display (title, seller, category, price, condition, is_sold, is_active, created_at) list_filter (is_sold, is_active, condition, category) search_fields (title, description, seller__username) raw_id_fields (seller, category) # 对于外键使用搜索框而不是下拉列表性能更好 readonly_fields (created_at, updated_at) admin.register(Order) class OrderAdmin(admin.ModelAdmin): list_display (order_number, buyer, item, status, total_amount, created_at) list_filter (status,) search_fields (order_number, buyer__username, item__title) readonly_fields (order_number, snapshot_title, snapshot_price, snapshot_image, created_at, updated_at)4.2 创建超级用户并访问后台运行以下命令创建一个可以登录后台的管理员账号。python manage.py createsuperuser按照提示输入用户名、邮箱和密码。然后启动开发服务器python manage.py runserver在浏览器中访问http://127.0.0.1:8000/admin/使用刚才创建的超级用户登录你将能看到我们注册的所有模型并可以进行增删改查操作。这是验证模型是否正确、快速填充测试数据的好方法。5. 前端页面与视图开发我们将使用Django的模板系统来渲染前端页面。为了简洁这里以商品列表页和详情页为例。5.1 配置项目URL与静态文件首先在项目根目录下创建templates和static文件夹用于存放HTML模板和静态资源。secondhand_trading_system/ ├── templates/ # 存放所有HTML模板 ├── static/ # 存放CSS, JS, 图片等 │ ├── css/ │ ├── js/ │ └── images/ └── ...修改config/settings.py告诉Django模板文件的位置。# config/settings.py import os TEMPLATES [ { ... DIRS: [BASE_DIR / templates], # 添加这行 ... }, ]配置项目根URL路由将请求分发到各个应用。# config/urls.py from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns [ path(admin/, admin.site.urls), path(, include(market.urls)), # 市场相关页面 path(accounts/, include(accounts.urls)), # 用户认证相关 path(accounts/, include(django.contrib.auth.urls)), # 使用Django内置的登录/登出视图 ] # 开发环境下提供媒体文件访问 if settings.DEBUG: urlpatterns static(settings.MEDIA_URL, document_rootsettings.MEDIA_ROOT) urlpatterns static(settings.STATIC_URL, document_rootsettings.STATIC_ROOT)5.2 创建基础模板在templates目录下创建base.html作为其他页面的基础骨架。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title{% block title %}二手交易平台{% endblock %}/title !-- 引入Bootstrap 5 CSS (CDN) -- link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/css/bootstrap.min.css relstylesheet !-- 引入自定义CSS -- link href/static/css/style.css relstylesheet {% block extra_css %}{% endblock %} /head body nav classnavbar navbar-expand-lg navbar-light bg-light div classcontainer a classnavbar-brand href{% url home %}二手集市/a div classcollapse navbar-collapse ul classnavbar-nav me-auto li classnav-itema classnav-link href{% url item_list %}浏览商品/a/li li classnav-itema classnav-link href{% url item_create %}发布商品/a/li /ul ul classnavbar-nav {% if user.is_authenticated %} li classnav-item dropdown a classnav-link dropdown-toggle href# rolebutton># market/views.py from django.shortcuts import render, get_object_or_404 from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.urls import reverse_lazy from .models import Item, Category from .forms import ItemForm # 需要先创建表单 class ItemListView(ListView): 商品列表页 model Item template_name market/item_list.html context_object_name items paginate_by 12 # 每页显示12个商品 def get_queryset(self): 重写查询集默认只显示未售出且上架的商品 queryset Item.objects.filter(is_soldFalse, is_activeTrue).order_by(-created_at) # 可以在这里添加分类筛选、搜索等功能 category_slug self.request.GET.get(category) if category_slug: category get_object_or_404(Category, slugcategory_slug) # 假设Category有slug字段 queryset queryset.filter(categorycategory) return queryset def get_context_data(self, **kwargs): 添加上下文数据比如所有分类 context super().get_context_data(**kwargs) context[categories] Category.objects.filter(is_activeTrue) return context# market/urls.py from django.urls import path from . import views urlpatterns [ path(, views.ItemListView.as_view(), namehome), # 首页即商品列表 path(items/, views.ItemListView.as_view(), nameitem_list), # 其他URL模式... ]创建模板文件templates/market/item_list.html{% extends base.html %} {% block title %}所有商品 - 二手集市{% endblock %} {% block content %} div classrow !-- 侧边栏分类筛选 -- div classcol-md-3 div classcard mb-4 div classcard-header商品分类/div div classlist-group list-group-flush a href{% url item_list %} classlist-group-item list-group-item-action {% if not request.GET.category %}active{% endif %}全部/a {% for cat in categories %} a href?category{{ cat.slug }} classlist-group-item list-group-item-action {% if request.GET.category cat.slug %}active{% endif %} {{ cat.name }} /a {% endfor %} /div /div /div !-- 主内容区商品列表 -- div classcol-md-9 div classrow row-cols-1 row-cols-sm-2 row-cols-md-3 g-4 {% for item in items %} div classcol div classcard h-100 shadow-sm {% if item.image %} img src{{ item.image.url }} classcard-img-top alt{{ item.title }} styleheight: 200px; object-fit: cover; {% else %} img src/static/images/default-item.jpg classcard-img-top alt默认图片 styleheight: 200px; object-fit: cover; {% endif %} div classcard-body d-flex flex-column h5 classcard-title{{ item.title|truncatechars:20 }}/h5 p classcard-text text-muted small{{ item.description|truncatechars:50 }}/p div classmt-auto p classcard-text fw-bold text-danger¥ {{ item.price }}/p p classcard-textsmall classtext-muted成色: {{ item.get_condition_display }}/small/p a href{% url item_detail item.pk %} classbtn btn-outline-primary btn-sm查看详情/a /div /div div classcard-footer text-muted text-center small发布于 {{ item.created_at|date:Y-m-d }}/small /div /div /div {% empty %} div classcol-12 div classalert alert-info暂无商品快来发布第一个吧/div /div {% endfor %} /div !-- 分页 -- {% if is_paginated %} nav aria-labelPage navigation classmt-4 ul classpagination justify-content-center {% if page_obj.has_previous %} li classpage-itema classpage-link href?page{{ page_obj.previous_page_number }}上一页/a/li {% endif %} {% for num in page_obj.paginator.page_range %} {% if page_obj.number num %} li classpage-item activespan classpage-link{{ num }}/span/li {% else %} li classpage-itema classpage-link href?page{{ num }}{{ num }}/a/li {% endif %} {% endfor %} {% if page_obj.has_next %} li classpage-itema classpage-link href?page{{ page_obj.next_page_number }}下一页/a/li {% endif %} /ul /nav {% endif %} /div /div {% endblock %}5.4 实现商品发布视图表单处理发布商品需要处理表单和图片上传。首先创建表单market/forms.py。# market/forms.py from django import forms from .models import Item class ItemForm(forms.ModelForm): 商品发布/编辑表单 class Meta: model Item fields [title, description, category, price, condition, image] widgets { description: forms.Textarea(attrs{rows: 4}), price: forms.NumberInput(attrs{step: 0.01}), } labels { title: 商品标题, description: 详细描述, category: 商品分类, price: 价格 (元), condition: 商品成色, image: 商品图片, }然后创建基于类的视图ItemCreateView。# market/views.py (续) class ItemCreateView(LoginRequiredMixin, CreateView): 发布商品 model Item form_class ItemForm template_name market/item_form.html success_url reverse_lazy(item_list) def form_valid(self, form): 在保存表单前自动将当前登录用户设置为卖家 form.instance.seller self.request.user return super().form_valid(form)对应的URL配置和模板也需要创建。模板item_form.html会渲染表单。通过这样的模式你可以继续实现商品详情页(ItemDetailView)、编辑页(ItemUpdateView)、删除页(ItemDeleteView)、用户注册登录页等。6. 核心功能进阶与优化6.1 用户认证与权限控制登录/注册可以使用Django内置的django.contrib.auth.views也可以使用django-allauth第三方包获得更强大的功能如社交登录。权限使用login_required装饰器或LoginRequiredMixin确保某些视图只有登录用户可访问。使用UserPassesTestMixin实现更细粒度的控制例如只允许商品发布者编辑自己的商品。class ItemUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): def test_func(self): item self.get_object() return self.request.user item.seller6.2 图片上传与处理存储开发时使用本地文件系统(MEDIA_ROOT)生产环境应使用云存储如AWS S3, 阿里云OSS或配置Nginx处理媒体文件。处理可以使用Pillow库和Django的ImageField进行简单的图片处理如生成缩略图。更复杂的处理可以考虑django-imagekit。6.3 搜索功能简单的搜索可以通过在ItemListView的get_queryset方法中过滤title和description字段实现。对于更复杂的全文搜索可以集成django-haystackWhoosh轻量或Elasticsearch强大。6.4 订单与交易流程这是一个简化流程真实项目需要考虑库存、支付接口、物流等。下单在商品详情页点击“立即购买”创建订单状态为pending。支付集成支付宝/微信支付沙箱环境进行模拟支付。支付成功后回调你的接口将订单状态改为paid并通知卖家。发货/收货卖家后台标记发货(shipped)买家确认收货(completed)。状态流转所有状态变更应有记录并可通过消息通知用户。7. 部署与上线简要毕业设计通常需要演示本地运行即可。但如果想部署到公网可以考虑选择平台PythonAnywhere, Heroku, 或国内的阿里云/腾讯云ECS。生产设置修改settings.py设置DEBUGFalse配置ALLOWED_HOSTS设置数据库如PostgreSQL收集静态文件(python manage.py collectstatic)。WSGI服务器使用Gunicorn或uWSGI配合Nginx。8. 常见问题与排查问题现象可能原因解决思路ModuleNotFoundError: No module named xxx虚拟环境未激活或依赖未安装。激活虚拟环境(source venv/bin/activate)运行pip install -r requirements.txt。OperationalError: no such table数据库迁移未执行或模型变更后未迁移。运行python manage.py makemigrations和python manage.py migrate。静态文件CSS/JS无法加载DEBUGFalse时Django不处理静态文件。开发时确保DEBUGTrue。生产环境需配置Nginx/Apache或使用whitenoise中间件。用户上传的图片无法显示MEDIA_URL和MEDIA_ROOT配置错误或开发环境未配置URL。检查settings.py配置并确保开发环境的urls.py中包含了static(settings.MEDIA_URL, ...)。TemplateDoesNotExist模板路径错误或未在TEMPLATES[DIRS]中设置。检查模板文件位置和settings.py中的TEMPLATES配置。表单提交后数据未保存视图逻辑错误如未调用form.save()或CSRF令牌缺失。检查视图的form_valid方法确保表单保存。在模板表单中确保有{% csrf_token %}。权限不足无法访问页面未使用LoginRequiredMixin或权限判断逻辑有误。为需要登录的视图添加LoginRequiredMixin检查test_func或dispatch方法中的逻辑。9. 毕业设计扩展建议与最佳实践代码结构清晰遵循Django的“应用”概念将功能模块化。accounts处理用户market处理核心交易可以再拆出orders、chat等应用。使用版本控制从一开始就使用Git并托管到GitHub或Gitee。清晰的Commit记录是加分项。编写文档在项目根目录创建README.md写明项目简介、技术栈、安装步骤、运行方法。这是专业性的体现。注重用户体验表单添加验证和友好的错误提示。列表页使用分页。重要的操作如删除使用弹窗确认。适当使用AJAX实现无刷新交互如收藏商品、发送消息。安全性永远不要信任用户输入使用Django表单或序列化器进行验证。对用户上传的文件进行类型和大小限制。生产环境务必设置强密码的SECRET_KEY并考虑环境变量管理。性能考虑数据库查询使用select_related或prefetch_related避免N1查询问题。对频繁访问且不常变化的数据如商品分类使用缓存。为答辩做准备准备一个功能演示脚本覆盖主要业务流程注册-登录-发布-浏览-下单。能清晰阐述你的数据库设计画个ER图、技术选型理由、遇到的挑战及解决方案。思考项目的不足和未来可扩展的方向如引入推荐算法、搭建微服务架构等。这个基于Django的二手物品交易系统项目涵盖了从环境搭建、数据库设计、后台开发、前端交互到部署上线的完整Web开发流程。通过实现它你不仅能完成一份出色的毕业设计更能切实掌握一个全栈开发者的核心技能。建议你按照本文的步骤亲手敲一遍代码遇到问题多查阅Django官方文档和社区这个过程本身就是最好的学习。