从 0 开始学习 Django:用一个商城项目理解 Web 后端开发
Django 是一个非常适合 Python 初学者入门 Web 后端开发的框架。如果你已经学过一点 Python但还不清楚“网页是怎么和数据库连起来的”“登录注册是怎么实现的”“购物车和订单这种功能怎么写”那么可以从一个完整的小项目开始学。一、为什么建议用项目学习 Django很多同学刚开始学 Django 时容易陷入一种状态看了很多教程但是不知道代码应该放在哪里会写print()但是不知道网页请求怎么处理知道数据库但是不会把数据库和页面连起来看懂了models.py但是不知道它和views.py、urls.py、HTML 模板之间是什么关系。所以我个人更推荐用“项目驱动”的方式学习 Django。比如一个商城系统就很适合入门因为它包含了 Web 开发中非常典型的功能用户注册、登录、退出商品列表、商品详情商品搜索购物车下单支付流程演示订单管理评论和回复图片上传数据库增删改查。这些功能看起来很多但它们背后的 Django 思想其实是统一的请求进入项目以后由路由找到视图函数视图函数操作数据库再把结果渲染到页面上。二、Django 项目的基本运行逻辑在学习 Django 之前需要先理解一个核心流程。用户在浏览器里访问一个地址例如http://127.0.0.1:8000/home/Django 后端大致会经历下面几个步骤浏览器请求 ↓ urls.py 匹配路径 ↓ views.py 执行业务逻辑 ↓ models.py 操作数据库 ↓ templates 渲染 HTML 页面 ↓ 浏览器显示结果也就是说Django 不是单独写一个 Python 文件就结束了而是把一个 Web 项目拆成了几个部分文件 / 目录作用urls.py负责写网址和视图函数的对应关系views.py负责写主要业务逻辑models.py负责定义数据库表templates/负责放 HTML 页面static/负责放 CSS、JS、图片等静态资源settings.py负责项目配置比如数据库、静态文件、时区等理解这个结构之后再去看 Django 项目就不会那么乱了。三、创建一个最基础的 Django 项目1. 安装 Django先创建虚拟环境python -m venv .venvWindows 激活.\.venv\Scripts\activatemacOS / Linux 激活source .venv/bin/activate安装 Djangopip install django查看是否安装成功django-admin --version2. 创建项目django-admin startproject mysite cd mysite创建完成后目录大概是这样mysite/ ├── manage.py └── mysite/ ├── settings.py ├── urls.py ├── asgi.py └── wsgi.py其中最常用的是manage.pyDjango 项目的命令入口settings.py项目配置urls.py总路由文件。启动项目python manage.py runserver浏览器访问http://127.0.0.1:8000/如果看到 Django 的欢迎页面就说明项目跑起来了。四、创建一个 appDjango 项目一般不会把所有代码都写在主目录里而是会创建一个或多个 app。例如我们创建一个商城 apppython manage.py startapp shop目录会变成mysite/ ├── manage.py ├── mysite/ │ ├── settings.py │ └── urls.py └── shop/ ├── models.py ├── views.py ├── admin.py ├── apps.py └── tests.py创建 app 后需要在settings.py里注册INSTALLED_APPS [ # Django 默认应用 django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, # 自己创建的应用 shop, ]这一步很重要。如果忘记注册 app后面写模型、迁移数据库时很容易出问题。五、Django 的 MVT 思想很多教程会讲 MVC但 Django 更常见的说法是 MVT。MModel模型负责数据库 VView视图负责业务逻辑 TTemplate模板负责页面展示比如在商城项目中商品表、用户表、订单表属于 Model商品列表页面的查询逻辑属于 View商品展示页面的 HTML 属于 Template。可以简单理解为models.py定义“有什么数据” views.py定义“怎么处理请求” templates定义“怎么展示给用户”六、用商品功能理解 models.py假设我们要写一个商品表可以在models.py中这样定义from django.db import models class Product(models.Model): title models.CharField(max_length100) description models.TextField() price models.DecimalField(max_digits10, decimal_places2) inventory models.PositiveIntegerField(default0) created_at models.DateTimeField(auto_now_addTrue) def __str__(self): return self.title这段代码的意思是数据库中有一张商品表表里有商品标题、描述、价格、库存和创建时间。常见字段解释字段说明CharField短文本比如商品名、用户名TextField长文本比如商品详情DecimalField小数适合价格IntegerField整数PositiveIntegerField非负整数适合库存DateTimeField日期时间ImageField图片上传字段ForeignKey一对多关系OneToOneField一对一关系如果是商城系统常见模型大概会包括用户 Customer 卖家 Seller 商品 Product 商品分类 Category 购物车 Cart 购物车条目 CartItem 订单 Order 评论 Comment 钱包 Pocket 付款记录 Record这些模型之间不是孤立的。比如一个卖家可以发布多个商品一个用户可以有一个购物车一个购物车里可以有多个商品一个商品可以有多条评论一个订单对应某个用户、某个商品和某个卖家。这就是 Django ORM 比较方便的地方它允许我们用 Python 类去描述数据库表之间的关系而不是一开始就手写大量 SQL。七、数据库迁移把 Python 类变成数据库表写完模型后需要执行迁移命令。第一步生成迁移文件。python manage.py makemigrations第二步应用迁移。python manage.py migrate可以简单理解为models.py 只是 Python 代码 makemigrations 生成数据库变更记录 migrate 真正修改数据库很多初学者容易忘记这一步。如果你修改了models.py但是数据库没有变化通常就是因为没有执行迁移。八、用 urls.py 理解路由路由就是“网址和函数之间的对应关系”。例如from django.urls import path from . import views urlpatterns [ path(home/, views.home, namehome), path(login/, views.login, namelogin), path(cart/, views.cart, namecart), ]意思是访问地址执行函数/home/views.home/login/views.login/cart/views.cart比如用户访问http://127.0.0.1:8000/cart/Django 就会找到views.py里的cart函数。九、用 views.py 理解视图函数视图函数负责处理用户请求。一个最简单的视图函数from django.shortcuts import render def home(request): return render(request, home.html)这表示用户访问home/时返回home.html页面。如果要从数据库里查询商品可以这样写from django.shortcuts import render from .models import Product def home(request): products Product.objects.all() return render(request, home.html, {products: products})这里做了三件事从数据库查询所有商品把商品数据放进products把products传给 HTML 页面。十、模板页面如何显示数据在templates/home.html中可以这样写!DOCTYPE html html head meta charsetUTF-8 title商品首页/title /head body h1商品列表/h1 {% for product in products %} div h2{{ product.title }}/h2 p{{ product.description }}/p p价格{{ product.price }}/p p库存{{ product.inventory }}/p /div {% empty %} p暂无商品/p {% endfor %} /body /html这里的{{ product.title }}表示输出商品标题。这里的{% for product in products %}表示循环显示商品列表。Django 模板语法不算复杂初学时先掌握三个就够了语法作用{{ 变量 }}输出变量{% for %}循环{% if %}条件判断十一、用户注册和登录的基本思路注册功能本质上是用户提交表单后端检查数据然后写入数据库。简单流程用户填写用户名、邮箱、密码 ↓ 后端接收 POST 请求 ↓ 检查用户名是否重复 ↓ 检查邮箱是否重复 ↓ 密码加密 ↓ 保存用户示例代码思路from django.shortcuts import render, redirect from django.contrib.auth.hashers import make_password from .models import Customer def register(request): if request.method POST: username request.POST.get(username) email request.POST.get(email) password request.POST.get(password) if Customer.objects.filter(usernameusername).exists(): return render(request, register.html, {error: 用户名已存在}) Customer.objects.create( usernameusername, emailemail, passwordmake_password(password) ) return redirect(login) return render(request, register.html)这里要注意密码不要直接明文保存应该使用哈希方式保存。十二、购物车功能怎么设计购物车通常需要两张表Cart购物车 CartItem购物车中的某个商品为什么不只用一张表因为一个用户有一个购物车但一个购物车里可以有很多商品。所以结构更适合写成用户 1 —— 1 购物车 购物车 1 —— 多个购物车条目 购物车条目 多 —— 1 商品简单模型示例class Cart(models.Model): customer models.OneToOneField(Customer, on_deletemodels.CASCADE) class CartItem(models.Model): cart models.ForeignKey(Cart, on_deletemodels.CASCADE) product models.ForeignKey(Product, on_deletemodels.CASCADE) quantity models.PositiveIntegerField(default1)加入购物车的大致逻辑用户点击“加入购物车” ↓ 后端拿到 product_id ↓ 判断商品是否存在 ↓ 判断是不是自己的商品 ↓ 判断库存是否充足 ↓ 购物车里没有该商品创建 CartItem 购物车里已有该商品数量 1这个功能很适合练习 Django 的查询、创建和更新操作。十三、订单和支付流程怎么理解初学 Django 时不建议一上来就接支付宝、微信支付。可以先写一个“演示支付流程”重点理解订单生成、库存变化和余额变化。一个简化版支付流程用户提交支付密码 ↓ 检查购物车是否为空 ↓ 检查地址是否完整 ↓ 检查余额是否足够 ↓ 检查库存是否足够 ↓ 扣除买家余额 ↓ 增加卖家余额 ↓ 减少商品库存 ↓ 生成订单 ↓ 清空购物车这里有一个关键点这些操作应该尽量放在事务里。因为支付不是一个单独操作。扣钱成功但订单没生成或者订单生成了但库存没减少都会导致数据不一致。Django 中可以使用from django.db import transaction with transaction.atomic(): # 扣余额 # 加卖家余额 # 减库存 # 创建订单 pass这样可以保证这一组操作要么都成功要么都失败。这也是商城类项目比普通留言板项目更适合练手的原因它不仅有普通 CRUD还会涉及更真实的业务流程。十四、Django 项目常用命令整理下面这些命令基本上每天都会用到。1. 启动项目python manage.py runserver2. 创建迁移文件python manage.py makemigrations3. 应用迁移python manage.py migrate4. 创建管理员账号python manage.py createsuperuser5. 进入 Django shellpython manage.py shell6. 运行测试python manage.py test7. 检查项目配置python manage.py check十五、适合初学者的 Django 学习路线我个人建议按这个顺序学1. 会启动 Django 项目 2. 理解项目目录结构 3. 会写 urls.py 4. 会写 views.py 5. 会使用模板 templates 6. 会写 models.py 7. 会做数据库迁移 8. 会实现注册登录 9. 会实现 CRUD 10. 会处理图片上传 11. 会写购物车、订单这类业务逻辑 12. 会写简单测试 13. 会整理 README 并上传 GitHub不要一开始就追求很复杂的技术栈。比如 Redis、Celery、Docker、Nginx、云服务器部署这些都可以后面再学。刚入门时先把下面这些东西吃透路由视图模型模板表单静态文件数据库迁移登录状态增删改查项目结构。这些才是 Django 的基础骨架。十六、一个可以参考的 Django 商城小项目如果你不想只看零散代码也可以参考我整理的这个 Django 商城项目https://github.com/qiqiqisi/django-shopping-websites.git项目名字是每羊小超市 · Django Shopping Website这个项目比较适合初学者因为它不是只有一个简单的 Todo List而是包含了一个商城项目中比较完整的流程用户注册、登录、退出邮箱验证码个人资料维护商品浏览、搜索、详情页卖家店铺商品上传和编辑购物车单商品购买购物车批量结算订单查看卖家发货状态更新评论和回复SQLite 默认启动MySQL 可选配置图片上传支付流程演示基础测试用例。对于刚学 Django 的同学来说这种项目的好处是你可以把每一个功能拆开看理解它在 Django 中分别对应哪个文件。比如商品模型 → models.py 商品页面 → templates 商品路由 → urls.py 商品查询逻辑 → views.py 商品图片 → media / static这比只看语法更容易建立整体理解。十七、如何运行这个项目1. 克隆仓库git clone https://github.com/qiqiqisi/django-shopping-websites.git cd django-shopping-websites2. 创建虚拟环境Windowspy -m venv .venv .\.venv\Scripts\activatemacOS / Linuxpython3 -m venv .venv source .venv/bin/activate3. 安装依赖pip install -r requirements.txt4. 初始化数据库cd test_market python manage.py migrate5. 启动项目python manage.py runserver然后访问http://127.0.0.1:8000/如果你只是本地学习默认 SQLite 就够用了不需要一开始就折腾 MySQL。十八、这个项目适合怎么学习建议不要直接全部看完而是按功能拆开。第一阶段先跑起来目标能成功启动项目 能注册账号 能登录系统 能看到页面这一阶段主要熟悉虚拟环境依赖安装数据库迁移启动服务浏览器访问本地项目。第二阶段看路由打开urls.py先看项目有哪些页面。重点理解网址路径 → 视图函数比如/register/ 注册 /login/ 登录 /home/ 首页 /cart/ 购物车 /checkout/ 结算 /my_order/ 我的订单 /search/ 搜索路由是理解项目入口的最好方式。第三阶段看模型打开models.py重点看这些模型Customer Seller Product Cart CartItem Order Comment Pocket Record不要急着看每一行代码。先看类名再看字段再看模型之间的关系。建议自己画一张简单关系图Customer —— Cart —— CartItem —— Product —— Seller Customer —— Order —— Product Product —— Comment Customer —— Pocket Pocket —— Record画完关系图以后整个商城的数据结构会清楚很多。第四阶段看视图函数打开views.py先找几个核心函数看register 注册 login 登录 home 商品首页 detail 商品详情 add_cart 加入购物车 cart 购物车 checkout 结算 my_order 我的订单 add_comment 添加评论看视图函数时建议按这个模板分析1. 这个函数对应哪个页面 2. 它接收 GET 还是 POST 3. 它查询了哪些模型 4. 它修改了哪些数据 5. 最后 redirect 还是 render这比一行一行死看有效得多。第五阶段自己改一个小功能当你能看懂大概逻辑后可以自己做一些小修改给商品增加一个品牌字段给商品增加一个销量排序给订单增加备注给用户个人中心增加手机号给商品搜索增加分类筛选给首页增加分页数量调整给评论增加字数限制给购物车增加总价显示。这些改动不算很大但很适合练习 Django 的完整开发流程改 models.py ↓ 执行 makemigrations ↓ 执行 migrate ↓ 改 views.py ↓ 改 templates ↓ 浏览器测试十九、初学 Django 容易踩的坑1. 修改 models.py 后忘记迁移解决方法python manage.py makemigrations python manage.py migrate2. app 没有注册到 INSTALLED_APPS解决方法检查settings.pyINSTALLED_APPS [ # ... app_name, ]3. 模板路径写错如果报错提示找不到模板检查templates 目录是否存在 settings.py 里 TEMPLATES 配置是否正确 render() 里的 HTML 文件名是否写错4. 静态文件不显示检查 HTML 里是否写了{% load static %}引用 CSS 时应该类似link relstylesheet href{% static css/styles.css %}5. 数据库字段改了但是旧数据不兼容解决方法给字段设置default允许nullTrue, blankTrue或者清空测试数据库重新迁移。初学阶段可以先用 SQLite操作成本更低。6. 登录状态判断混乱登录以后通常需要把用户信息保存到 session例如request.session[user_id] customer.id request.session[username] customer.username后面访问个人中心、购物车、订单时再从 session 里取当前用户。二十、总结Django 入门的重点不是背 API而是理解完整流程URL 负责入口 View 负责逻辑 Model 负责数据 Template 负责页面 Settings 负责配置如果只是看文档很容易觉得抽象。但如果配合一个完整项目比如商城系统就能把这些知识点串起来。我个人建议初学者不要一上来就做太大的项目可以先从一个结构清楚、功能完整、能本地跑起来的小项目开始。先把注册登录、商品展示、购物车、订单这些基础功能理解清楚再去扩展真实支付、部署、接口开发和前后端分离。项目地址放在这里感兴趣可以 clone 下来跑一遍https://github.com/qiqiqisi/django-shopping-websites.git如果你正在做 Django 课程设计、Web 开发作业、毕业设计雏形或者想准备一个 GitHub Portfolio 项目这类商城系统会比单纯的练习 Demo 更有展示价值。参考学习方向后续可以继续扩展接入真实支付增加商品分类筛选增加后台数据统计增加 REST API改造成前后端分离项目使用 MySQL 部署使用 Docker 打包部署到云服务器增加权限系统增加单元测试和接口测试。Django 的学习路线并不难关键是别只看概念。把一个项目真正跑起来、改起来、调通一次理解会快很多。