1. 环境准备:Python、PyCharm 与 Django 的三方关系
如果你刚接触 Python Web 开发,PyCharm 和 Django 几乎是绕不开的组合。PyCharm 是目前最主流的 Python IDE,而 Django 是 Python 生态里最成熟的全栈 Web 框架。把这两个放在一起,最大的好处不是替你省下几条命令,而是让代码补全、语法提示、调试器、数据库工具全部集中在同一个界面里。项目跑到哪一步、哪个变量是什么值、异常抛出在哪一行,你都能看得明明白白。这篇内容我按平时自己搭项目的习惯来写,从装环境讲到跑通第一个页面,再聊一聊模型、后台、模板和常见的排查方法。没有 Django 项目经验的新手可以用来照着做,跟教程做了一半卡住的人也可以拿来做对照。
1.1 选择 Python 版本和 PyCharm 版本
开始之前,先把底层的软件版本定下来。Django 对 Python 版本有明确要求,目前主流的 Django 4.2 LTS 和 Django 5.x 都要求 Python 3.8 以上,我建议直接装 Python 3.10 或 3.11,兼容性比较稳。Python 3.12 和 3.13 也能跑,但有些第三方库可能还没跟上,新手没必要一上来就追最新。装 Python 的时候记得勾选“Add Python to PATH”,这步很多人会漏掉,漏掉之后在终端里敲python会直接提示命令不存在,后面每一步都会变麻烦。
PyCharm 分社区版和专业版。社区版免费,支持 Python 开发和调试,足够用来学习 Django;专业版是收费的,额外提供 Django 项目的可视化创建方式、数据库工具和前端框架支持。我个人的看法是,新手先用社区版完全没问题,等真的需要专业版的功能了再说。PyCharm 都可以在官网下载,安装过程没什么难点,安装时注意选择关联.py文件、添加“Open Folder as Project”这类选项,能省不少事。
还有个容易被忽略的点:PyCharm 里的“New Project”界面会让你选择解释器,这里一定要选对 Python 环境,否则后面会出现“No module named django”之类的报错。解释器不是说你系统里装了 Python 就行,PyCharm 需要明确知道该用哪一份 Python 来运行项目。通常我们会在创建项目时顺便建立一个独立的虚拟环境,把 Django 装进这个虚拟环境里,而不是直接装到系统 Python 里。
1.2 创建虚拟环境:为什么不用全局环境
很多新手一上来就会问,我直接pip install django装到全局不行吗?能用,但不推荐。你电脑上可能有多个 Python 项目,每个项目依赖的 Django 版本、第三方库版本不一定相同。今天项目 A 需要 Django 4.2,明天项目 B 需要 Django 5.0,如果都装在全局,版本冲突很快就会爆发。虚拟环境就像给每个项目开一间独立的小房间,房间里的 Python 版本、pip 包列表互不干扰。
创建虚拟环境的方式有两种:一是用 Python 自带的venv,二是用 Anaconda 的conda。绝大多数情况下,venv就够了。在 PyCharm 里新建项目时,它会默认帮你创建好venv,你只需要在解释器设置里确认一下路径和 Python 版本。如果项目是别人给的,打开之后发现没有虚拟环境,可以通过 PyCharm 右下角的解释器设置手动添加,选择“Virtualenv Environment”再点“New”,指定 Python 路径即可。
虚拟环境有一个很直观的判断方法:在 PyCharm 自带终端中,命令提示符前面会出现(venv)字样。看到它,就说明当前命令行使用的是项目专用的虚拟环境。如果你发现敲pip install安装的包在项目里找不到,多半就是终端没有激活虚拟环境。PyCharm 的终端通常会自动激活,但如果你自己另开了一个终端窗口,就需要手动执行激活命令,Windows 下是venv\Scripts\activate,macOS 和 Linux 下是source venv/bin/activate。
1.3 安装 Django:从 pip 到验证版本
进入虚拟环境之后,安装 Django 就很直接了。在 PyCharm 终端里执行:
pip install django这个命令会安装当前 PyCharm 使用的 Python 环境里最新且兼容的 Django 版本。如果想指定版本,可以写成pip install django==4.2.7,在需要和其他项目保持一致的场景下更稳妥。安装时如果下载速度比较慢,可以考虑配置 pip 镜像源,这里就不展开讲具体地址了,搜索一下“pip 国内镜像”就能找到很多。
安装完成后,用python -m django --version验证。用python -m django而不是直接敲django,是为了确保使用的是当前虚拟环境里的 Django,而不是系统里其他可能存在的版本。如果输出类似5.0.6的版本号,说明安装成功;如果提示 No module named django,就先检查 pip 安装到了哪个环境,再看 PyCharm 的解释器是不是指向了同一个环境。这两者的对应关系,是新手最容易踩的第一个坑。
2. 把 Django 项目放进 PyCharm:两种创建方式
环境准备好了,接下来就是创建项目本体。这里有两种主流做法,第一种是用 PyCharm 专业版的可视化模板,第二种是先用命令行创建再用 PyCharm 打开。社区版用户大概率只能用第二种,但第二种其实更接近团队协作时的真实操作习惯,所以我建议不管是什么版本,都认真看一下。
2.1 方式一:PyCharm 专业版内置模板创建
如果你用 PyCharm 专业版,创建流程会非常省事。打开 PyCharm,点击 New Project,左侧选择 Django,然后设置项目名称、项目目录和解释器。专业版会自动生成一个带基础结构和管理后台的 Django 项目,同时为你配置好运行模板,创建完成之后可以直接点绿色三角运行。这个模板还有个好处,它会自动在settings.py里把项目关键配置都处理好,比如INSTALLED_APPS、TEMPLATES、默认数据库等,对于刚接触框架的人来说,能少写很多初始化代码。
不过我不建议依赖这个可视化工具到“完全不了解底层命令”的程度。因为它把很多步骤都隐藏了,你点一下按钮,它就在背后执行了django-admin startproject和startapp。一旦哪天需要脱离 PyCharm、在服务器上部署项目,或者接手一个用命令行创建的项目,你会发现自己好像什么都不会。更好的做法是:用可视化模板创建完项目后,再手动在终端里跑一下python manage.py runserver,看看它到底做了什么,这样才能真正理解框架的工作方式。
2.2 方式二:命令行创建 + 打开项目(社区版通用)
这种方式对我来说是最可控的。先打开 PyCharm,选择“Open”打开一个空目录,或者直接在系统终端里进入你想放项目的目录,然后执行:
django-admin startproject mysite .注意命令最后的点号。它表示在当前目录下生成manage.py和mysite配置包,而不是额外多套一层同名目录。很多教程会省略这个点,写成django-admin startproject mysite,结果你会发现多了一层mysite/mysite,后续运行时经常出现路径错乱。用点号创建的好处是项目根目录直接就是 PyCharm 的项目根目录,manage.py 就在眼前,各种运行配置也更好设置。
创建完成之后,目录结构大致是这样的:
mysite/ ├── manage.py └── mysite/ ├── __init__.py ├── settings.py ├── urls.py └── wsgi.pymanage.py是项目管理和运行的入口,所有常用命令都要通过它来执行。内层mysite是项目的配置包,settings.py保存配置,urls.py保存根路由。PyCharm 打开这个目录后,可能会提示你选择解释器,把刚才建好的虚拟环境选上就行。选好之后,在终端执行python manage.py runserver,如果看到 “Starting development server” 和http://127.0.0.1:8000/,说明项目已经启动成功。
2.3 用 PyCharm 打开项目后还要检查什么
用命令行创建完再用 PyCharm 打开,通常还需要检查两件事。第一,PyCharm 是否正确识别了项目根目录。打开项目后,左侧 Project 窗口应该能看到manage.py文件。如果它被折叠在很深的目录里,说明你打开的层级不对,需要重新打开正确目录。第二,解释器是否正确。打开设置(Settings/Preferences),找到 Project: mysite -> Python Interpreter,确认指向的是刚才的虚拟环境。完成后,建议先手动 Run 一次项目,确保环境没有问题,再配置 PyCharm 的启动按钮。
这一步还有个小技巧:settings.py里有一个ALLOWED_HOSTS,默认是空列表。如果你只用http://127.0.0.1:8000/访问,不需要动它。但如果你想用局域网 IP 访问开发服务器,或者以后计划调试移动端页面,可以把本机 IP 或域名加进去,否则会提示Invalid HTTP_HOST。新手阶段不动它就行,等真遇到这个报错再回来改也不迟。
3. 创建第一个 App 并让它跑起来
Django 项目里有一个核心概念:项目(project)和应用(app)。可以这样理解,项目是一个装应用的大盒子,应用是这个盒子里负责具体业务的功能模块。刚创建的mysite项目本身没有一个真正的业务页面,接下来我们来创建第一个 app,实现一个最简单的投票功能雏形,从路由走到页面。
3.1 项目与 App:什么是 App,为什么需要它
很多新手刚接触 Django 时会混淆“项目”和“应用”。startproject创建的是项目配置,startapp创建的是业务应用。一个项目可以包含多个应用,比如一个电商项目可以有用户应用、商品应用、订单应用。把小功能按应用拆分,代码更容易维护,以后某个应用要复用到另一个项目时,也可以直接拷贝相关目录。Django 的哲学是“可复用”,它希望你把功能模块做成独立的应用,而不是把所有逻辑堆在一个文件里。
创建 app 的命令很简单:
python manage.py startapp home这里我起了个名字叫home,你可以按自己的业务场景起。创建之后,项目根目录会多一个home文件夹,里面有views.py、models.py、admin.py、migrations/等重要文件。views.py用来写业务视图函数,models.py用来定义数据表模型,admin.py用来注册后台管理,migrations/用来记录数据库迁移过程。这些文件一开始都是空的或近乎空的,马上我们就要往里填内容。
3.2 注册 App:为什么会报“Unknown command”
创建完 app 之后,很多新手会直接写代码,然后发现运行完全正常,但要使用 Django 的某些功能时却报错。原因在于,任何自定义 app 都要先注册到项目的settings.py的INSTALLED_APPS列表里,Django 才会把它当作项目的一部分来管理。打开mysite/settings.py,你大概会看到这样一段:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'home', ]注意我在末尾加了'home'。有些教程会写成'home.apps.HomeConfig',这是 Django 3.2 之后推荐的方式,作用一样,但直接写'home'在绝大多数项目里已经够用。注册完 app 后,Django 才能找到你写的模型、迁移、后台、模板等文件。如果不注册,后面执行makemigrations时会提示没有检测到模型变化,因为 Django 压根没去读这个 app。
3.3 写第一个视图:从 URL 到页面
现在开始写第一个页面。打开home/views.py,改成下面这样:
from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse("Hello, Django from PyCharm!")这个视图函数接收一个request参数,返回一段简单的字符串。它不是最终形态,但足够让你理解“视图返回响应”这条链路。下一步是把视图和 URL 绑定。Django 处理请求的流程是:浏览器发来请求,Django 根据urls.py里的规则找到对应的视图函数,执行视图并返回响应。因此,我们需要先在home应用里创建一个urls.py文件:
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ]然后在根配置mysite/urls.py里,把home的 URL 配置包含进来:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('home.urls')), ]这里的关键是include。它的意思是,当请求匹配到空路径时,交给home.urls去继续匹配。如果你希望首页路径是/home/,可以把第二个path改成path('home/', include('home.urls'))。改完保存,重新运行python manage.py runserver,浏览器打开http://127.0.0.1:8000/,就能看到刚刚写的那段字符串了。这就是一个最简单的、从浏览器到服务器再到视图函数的完整请求链路。
3.4 配置 PyCharm 的一键启动按钮
每次都用终端敲runserver当然可以,但 PyCharm 的启动按钮能让效率更高。点击右上角的下拉菜单,选择“Edit Configurations”,然后添加一个 Django Server 配置。如果你用的是专业版,新建项目时它可能已经帮你配置好了;社区版就需要手动填一下。主要填写两个地方:Name 可以写runserver,Host 填127.0.0.1或省略,Port 填8000。然后确认 Python Interpreter 指向虚拟环境,Working directory 指向项目根目录,也就是有manage.py的那一层。
配置好之后,每次点击绿色三角就能启动开发服务器,点击旁边的虫子图标就能进入调试模式。调试模式下,所有请求都会经过断点暂停,你能看到每个变量的当前值,比在代码里乱写print要舒服得多。我建议从一开始就养成用 Run Configuration 的习惯,后面项目变大、启动参数变复杂时会很有帮助。
4. 模型、数据库迁移与 Admin 后台
页面能访问之后,下一步是让它和数据产生关系。Django 最方便的一点是,它自带一套 ORM,可以直接用 Python 类来描述数据库表,再通过迁移命令同步到数据库。默认情况下,Django 使用 SQLite 数据库,它只是一个本地文件,不需要额外安装数据库服务,非常适合学习和前期开发。
4.1 在 App 里定义模型
我们还是用投票功能的例子。打开home/models.py,定义一个简单的问题模型:
from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('发布日期')这里每一个类属性都对应数据库表中的一个字段。CharField对应字符串字段,max_length一定要设置;DateTimeField对应日期时间字段。Django 会自动为表创建自增主键id,不需要手动定义。定义完模型,数据库里其实还没有这张表,下一步需要生成迁移文件并执行迁移。
4.2 生成并执行迁移:makemigrations 和 migrate
在终端运行这两条命令:
python manage.py makemigrations home python manage.py migratemakemigrations会根据models.py的变化,生成一个描述“我要在哪张表里增加哪些字段”的迁移文件,存在home/migrations/目录下。migrate才是真正把这些迁移应用到数据库。很多新手会问,为什么不能一条命令直接建表?因为生成迁移文件这个步骤让你在真正改数据库之前,可以再检查一遍字段定义是否正确,也给团队协作提供了版本记录。如果makemigrations提示No changes detected,通常有几种原因:模型没有变化、app 没有注册,或者你指定的 app 名称写错了。
执行完迁移,可以打开 PyCharm 的 Database 工具面板,连接项目里的db.sqlite3文件,刷新一下就能看到 Django 帮你创建的十几张表,其中包括刚刚的home_question表。Django 的表名规则是“app名小写_模型名小写”,比如home_question。用工具直接看数据很方便,但要注意:不要手动乱改表中的数据,尤其是用 SQL 直接删改,Django 有自己的一套缓存机制,手动改容易引发莫名的数据问题。
4.3 用 Django Admin 管理数据
Django 自带一个很强大的后台管理系统,之前我们在根路由里已经配了admin/。要想进入后台,首先得创建一个超级管理员账号:
python manage.py createsuperuser命令会依次提示输入用户名、邮箱(可选)和密码。注意密码要求不少于 8 位,且不能太简单。创建完成后,刷新http://127.0.0.1:8000/admin/,用刚才的账号登录,就能看到 Django 自带的管理界面。不过此时Question表还没有出现在后台里,需要在home/admin.py里注册一下:
from django.contrib import admin from .models import Question admin.site.register(Question)注册后重新进入后台,就能看到 Question 的管理入口,可以新增、编辑、删除数据,非常直观。对于学习阶段来说,用后台往数据库里塞几条测试数据,比手动写 SQL 方便多了。
4.4 数据库迁移出现冲突怎么办
迁移是 Django 项目里很容易出问题的环节,尤其是多人协作或者自己反复修改模型时。一个非常常见的场景是:你在模型里加了字段,执行了迁移,后来又改了,再执行迁移时报错说“It is impossible to add a non-nullable field ... because it needs a default value”。意思是新增的字段非空,但表里已经有数据,Django 不知道给旧数据填什么值。解决办法是在迁移命令的交互提示里给一个默认值,或者先删除数据库里已有的测试数据,再重新迁移。如果是自己本地学习用的项目,最简单的方式是直接删除db.sqlite3文件,删掉migrations目录下除了__init__.py之外的文件,然后重新执行makemigrations和migrate。这个方法很暴力,但确实能解决绝大多数本地开发的迁移困局。
5. 让页面更完整:模板、静态文件与表单
只返回一段普通字符串的页面显然不够用。接下来我们把视图改成渲染 HTML 模板,加入静态文件支持,再做一个小表单,这部分是最能体现 Django 开发体验的地方。
5.1 模板目录和渲染变量
在home应用下创建templates/home/index.html目录结构,注意 Django 默认的模板查找规则是“应用名/templates/应用名/模板名”,这样设计是为了避免多个应用里的同名模板互相覆盖。比如:
home/ ├── templates/ │ └── home/ │ └── index.html在index.html里写点基本 HTML 结构:
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>{{ welcome_text }}</h1> <p>当前时间:{{ current_time }}</p> </body> </html>双花括号{{ }}是 Django 模板的变量占位符。在视图里,我们用字典把变量传给模板:
from django.shortcuts import render from django.utils import timezone def index(request): context = { 'welcome_text': '欢迎来到 Django 项目', 'current_time': timezone.now(), } return render(request, 'home/index.html', context)render函数会加载指定的模板文件,用context里的数据填充模板中的变量,再把渲染后的 HTML 返回给浏览器。这是 Django 模板系统最基础也最常用的用法。模板里除了变量,还有{% if %}、{% for %}这类模板标签,可以在 HTML 里写简单的逻辑,但不要把复杂的业务逻辑堆在模板里,模板的核心是展示数据,不是处理数据。
5.2 静态文件:CSS 和图片
为了让页面稍微好看一点,我们需要引入 CSS。Django 通过static目录来管理静态文件。在home应用下新建static/home/style.css,例如:
body { font-family: "Microsoft YaHei", sans-serif; background-color: #f5f5f5; padding: 40px; }然后在模板开头加载静态文件,并引入 CSS:
{% load static %} <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="{% static 'home/style.css' %}"> <title>首页</title> </head>{% load static %}告诉模板文件需要使用静态文件功能,{% static 'home/style.css' %}会生成实际的文件 URL。在开发阶段,Django 会自动处理静态文件,不需要额外配置;但到部署阶段,静态文件的收集和托管是一个重点话题,那时候会用到python manage.py collectstatic。学习阶段只要记住静态文件要放在 app 下的static目录里就行。
5.3 让页面接收表单数据:POST 与 CSRF
很多 Web 应用都需要用户输入,比如投票选择、评论留言。Django 对表单提交有严格的安全要求,其中一个绕不开的概念是 CSRF 防护。简单说,CSRF 是一种攻击方式,它让受害者在不知情的情况下向某个已登录网站发送恶意请求。Django 的解决办法是要求所有 POST 表单都携带一个随机 token,用于验证请求确实来自当前站点。
模板里的表单可以这样写:
<form action="{% url 'vote' %}" method="post"> {% csrf_token %} <label> <input type="radio" name="choice" value="1">选项一 </label> <label> <input type="radio" name="choice" value="2">选项二 </label> <button type="submit">提交</button> </form>注意{% csrf_token %}一定不能删,否则提交时会得到 403 错误。视图里处理 POST 请求时,需要区分请求方法:
from django.shortcuts import render, redirect from django.http import HttpResponse def vote(request): if request.method == 'POST': choice = request.POST.get('choice') # 这里可以执行数据保存逻辑 return HttpResponse(f'你选择了 {choice}') return redirect('index')用request.POST.get('choice')获取表单提交的数据。这只是最基础的处理方式,真正的项目里还会有表单验证、幂等处理、错误提示等内容,但核心链路已经通了:模板展示表单,浏览器提交 POST,Django 根据 URL 找到vote视图,视图处理请求并返回响应。到了这一步,你已经不是一个只会“看教程”的人了,而是实实在在地理解了 Django 的请求处理流程。
6. 运行、调试与常见问题排查
做到这里,项目已经完整跑起来了。但在实际开发中,遇到问题几乎是必然的,所以我整理了一份自己的排查经验。这些经验不是从官方文档里抄来的,而是在一次次踩坑之后总结出来的。
6.1 用 PyCharm Debug 按钮定位问题
很多同学遇到报错第一反应是看最下面几行红色日志,然后到处复制错误信息搜索。这样做当然有用,但调试复杂逻辑时,PyCharm 的断点调试效率更高。在代码行号后面点一下,会出现红色圆点,这就是断点。启动调试模式后,请求走到这一行会暂停,此时你可以查看当前函数里所有变量的值,也可以按“Step Over”一步步执行,观察代码分支走向。
举个例子,视图里拿到一个request.POST,你不确定里面有没有某个字段,直接在断点上查看request.POST的字典内容,比盲猜快得多。调试还有一个好处:不会像print那样污染代码,你不需要在调试完后再到处删打印语句。DEBUG 模式下 Django 会自动关闭模板缓存,改完模板文件刷新浏览器就能看到新效果,这一点比普通运行模式更舒服。
6.2 常见问题速查表
这里把我遇到最多的几类问题整理成一个表格,方便大家直接对照。
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
No module named django | 当前环境没有安装 Django,或 PyCharm 解释器选错 | 检查 PyCharm 的解释器路径,进入项目虚拟环境后执行pip install django |
Error: That port is already in use | 8000 端口被另一个进程占用 | 更换端口运行:python manage.py runserver 8001 |
TemplateDoesNotExist | 模板目录位置不对,或应用未注册 | 确认模板放在templates/应用名/模板名,并在INSTALLED_APPS注册应用 |
NameError: name 'redirect' is not defined | 视图文件里没有导入该函数 | 在文件头部加上对应的import语句 |
Unknown command: 'startapp' | 命令敲错,或没有在项目根目录执行 | 先确认终端位置在manage.py同目录,再执行python manage.py startapp 应用名 |
| 提交表单返回 403 | 模板缺少{% csrf_token %} | 在表单中加入{% csrf_token %} |
| 页面修改后没生效 | 开发服务器未自动重启,或浏览器缓存 | 重启服务器刷新页面,或更换浏览器测试 |
| 数据库新增字段后迁移失败 | 旧表已有数据,非空字段无法直接添加 | 给新字段设置默认值,或删除本地测试数据重新迁移 |
这个表格对应的是新手阶段最常见的八类问题。其中TemplateDoesNotExist是出现频率最高的一类,几乎每个人都会遇到。核心原因往往不是模板文件不存在,而是 Django 在配置的模板查找路径里没找到它。只要确认模板放在templates目录下的正确层级,并且在INSTALLED_APPS里注册了对应应用,这个问题基本能解决。
6.3 开发服务器的自动刷新机制
Django 开发服务器自带热重载(auto-reload),当你修改.py文件时,它会自动重启,所以大多数时候改完代码直接刷新浏览器即可。但要注意几个例外:新增了文件,比如新建了urls.py、模板文件、静态文件,有时需要手动重启服务器;如果使用了 PyCharm 的 “Safe Write” 功能,在某些操作系统上可能会触发多次重启,这个问题可以通过关闭 Safe Write 来缓解。另外,调试模式下改动模型后,不要指望服务器自动替你迁移数据,迁移命令仍然需要手动执行。
runserver还有一个用途比较冷门,但它很适合新手踩坑时绕过浏览器限制。你可以用python manage.py runserver 0.0.0.0:8000让服务器监听所有网络接口,这样同一局域网里的手机或另一台电脑也能访问。这个操作在调试移动端页面时很方便,但要注意开发服务器不应该直接暴露到公网,它没有并发处理能力和安全防护,只适合在受信任的内网环境里使用。
6.4 我的个人实操笔记
最后分享几个我自己的习惯,不算什么高深技巧,但确实帮我省了很多时间。第一,创建新项目时,我不会只用 PyCharm 的模板,而是先在终端里django-admin startproject创建好目录,再用 PyCharm 打开。这样我能清楚每一步发生了什么,出现问题也知道去哪排查。第二,每次写模型前,我会先在纸上画出字段和表关系,确认后再写进models.py,这能大幅减少后面返工修改模型的次数。第三,定期备份db.sqlite3数据库文件,因为本地开发时经常要折腾迁移,一个操作失误可能把所有测试数据清空,有备份就能退回上一步。
我还习惯在项目里顺手配置一个.gitignore文件,至少把venv、__pycache__、db.sqlite3排除掉,避免把虚拟环境和本地数据库提交到代码仓库。这样别人 clone 项目后,只需要pip install -r requirements.txt并执行migrate,就能把项目跑起来。等你有机会接触真实团队项目时,会发现这些都是再普通不过的基本功。
从创建虚拟环境到写第一个视图,从定义模型到完成后台管理,再到模板渲染、表单提交和调试排查,你已经把 Django 项目从零到一完整跑通了。剩下的路,就是在项目里加入更复杂的业务逻辑、更完善的分层结构,以及读一读 Django 官方文档里关于 ORM、认证、部署这些更深入的内容。如果你在练习过程中遇到了今天没列出来的报错,先别急着到处问,把错误信息完整读一遍,再对着路径、环境、版本这三个方向排查,大部分问题都能自己解决。