我们用最通俗、最生活化的方式来聊聊 Python 的 Django,就算你完全没写过代码,也能真正理解它是什么、为什么强大、以及它是怎么工作的。
🌟 一、先打个比方:Django 就像一家"全包型餐厅"
想象你要开一家餐厅:
- 如果你从零开始(比如用原始的 Python 写网站),你需要:
- 自己盖房子(搭服务器)
- 自己买菜、洗菜、切菜、炒菜(处理用户请求、数据库、逻辑)
- 自己设计菜单、收银、记账(管理后台、用户登录等)
- 还要防小偷、防火(安全防护)
这太累了!
而 Django 就像一个已经装修好、设备齐全、厨师和服务员都配齐的"智能餐厅模板"。你只需要:
- 告诉它菜单上有什么菜(你的网站功能)
- 它自动帮你搞定厨房、收银台、后厨管理系统、甚至顾客点单页面!
这就是 Django 的核心理念:"不要重复造轮子"(Don't Repeat Yourself, DRY) 和 "约定优于配置" ------ 它已经为你做好了大多数常见任务的标准解决方案。
🧱 二、Django 的三大核心组件(小白也能懂)
Django 主要由三块"积木"组成,它们一起工作:
1. 模型(Model)------ 你的"数据仓库"
- 比如你要做一个博客网站,你需要存储"文章标题、内容、作者、发布时间"。
- 在 Django 里,你只要用几行简单的代码定义这些信息,Django 就会自动帮你创建数据库表格,并提供操作数据的方法。
- 你不用直接写复杂的数据库命令,Django 用"对象"的方式让你像操作普通变量一样操作数据。
✅ 小白理解:Model 就是你网站的"记事本",记录所有重要信息。
2. 视图(View)------ 你的"服务员"
- 当用户访问你的网站(比如打开首页),Django 的 View 负责"接待":
- 从 Model 里取出数据(比如最近5篇文章)
- 把数据交给模板(Template)去展示
- View 是连接用户请求和数据之间的桥梁。
✅ 小白理解:View 就是那个听到顾客说"我要看最新文章",然后跑去仓库拿数据、再端给顾客的人。
3. 模板(Template)------ 你的"菜单和摆盘"
- Template 是 HTML 文件(网页的骨架),但可以嵌入动态内容。
- 比如:
<h1>{``{ article.title }}</h1>------ 这里的{``{ article.title }}会被替换成真实的文章标题。 - 你不需要懂编程也能看懂模板大概在做什么。
✅ 小白理解:Template 就是最终呈现给用户的漂亮网页,就像餐厅里精心摆盘的菜。
🔧 三、Django 还自带哪些"超能力"?
除了上面三大件,Django 还内置了很多"开箱即用"的功能:
| 功能 | 作用 | 举例 |
|---|---|---|
| Admin 后台 | 自动生成管理界面 | 你写完 Model,立刻就能登录后台增删改文章,无需额外开发! |
| 用户认证系统 | 登录、注册、权限管理 | 几行代码就实现"只有管理员能发文章" |
| URL 路由系统 | 把网址映射到具体功能 | /blog/123 → 显示第123篇文章 |
| 安全防护 | 防 CSRF、XSS、SQL 注入等 | 自动帮你挡住很多黑客攻击 |
| 开发服务器 | 本地一键启动网站 | 写完代码,点一下就能在浏览器看到效果 |
💡 这些功能如果自己从头写,可能要几个月;用 Django,几分钟就 ready!
🏗️ 四、Django 的核心理念(真正理解的关键)
✅ 1. MTV 架构(Model-Template-View)
- 这是 Django 的"工作流程":
- 用户访问网址 →
- Django 根据 URL 找到对应的 View →
- View 从 Model 获取数据 →
- View 把数据塞进 Template →
- 最终生成 HTML 返回给用户
类似于"顾客点单 → 服务员接单 → 厨房做菜 → 上菜"。
✅ 2. "约定优于配置"
- Django 有一套默认规则(比如项目结构、文件命名),你只要遵守,它就能自动工作。
- 不需要写一堆配置文件告诉它"我的数据库在哪""模板放哪"------它已经猜好了!
✅ 3. 快速开发 + 可扩展
- 小项目:几天就能做出带后台的完整网站。
- 大项目:Instagram、Pinterest 都用 Django 支撑亿级用户!
🌰 五、举个真实例子:做个"待办事项"网站
假设你想做一个 Todo 应用:
-
定义 Model(数据):
pythonclass Task(models.Model): title = models.CharField(max_length=100) done = models.BooleanField(default=False)→ Django 自动创建数据库表!
-
写 View(逻辑):
pythondef task_list(request): tasks = Task.objects.all() return render(request, 'tasks.html', {'tasks': tasks}) -
做 Template(页面):
html<!-- tasks.html --> <ul> {% for task in tasks %} <li>{{ task.title }} {% if task.done %}✅{% endif %}</li> {% endfor %} </ul> -
配置 URL:
pythonpath('tasks/', views.task_list) -
运行 → 访问
/tasks/就能看到所有待办事项!
而且你还可以:
- 用
python manage.py createsuperuser创建管理员账号 - 登录
/admin后台直接添加/删除任务! - 全程几乎不用碰数据库或复杂配置!
🎯 六、总结:Django 到底是什么?
Django 是一个用 Python 写的"全能型网站开发框架",它把建网站的90%重复工作都包了,让你专注做真正有创意的部分。
- 对小白友好:结构清晰,文档完善,社区强大。
- 对企业实用:安全、稳定、可扩展。
- 对开发者高效:一天就能做出原型,一周上线 MVP(最小可行产品)。
🚀 最后一句话记住 Django:
"Django 不是教你如何造车,而是直接给你一辆性能可靠的 SUV,你只管踩油门去目的地。"
如果你以后想做网站、创业、或者学 Web 开发,Django 是一个极佳的起点。
那我们就手把手从零开始,用 Django 搭建一个超简单的"留言墙"网站------任何人都能访问、看到留言,还能提交自己的留言。
💡 你不需要懂代码也能跟着做!我会解释每一步在做什么、为什么这么做。
只要你有电脑(Windows / Mac / Linux 都行),装好 Python,就能开始!
🛠️ 第 0 步:准备工作
1. 确保你安装了 Python
打开终端(Mac/Linux)或命令提示符/PowerShell(Windows),输入:
bash
python --version
或
bash
python3 --version
如果显示类似 Python 3.8.10 或更高版本(建议 3.8+),就 OK!
如果没有,请先去 https://www.python.org/downloads/ 下载安装。
✅ 安装时记得勾选 "Add Python to PATH"(Windows 用户特别注意!)
2. 创建项目文件夹(可选但推荐)
比如在桌面新建一个文件夹叫 my_django_site,后面所有文件都放这里。
🚀 第 1 步:安装 Django
在终端里运行:
bash
pip install django
等几秒钟,看到 Successfully installed django-... 就说明装好了!
🔍
pip是 Python 的"应用商店",用来安装各种工具包。
🏗️ 第 2 步:创建 Django 项目
在你的项目文件夹里(比如 my_django_site),运行:
bash
django-admin startproject message_board .
⚠️ 注意最后有个 点(.)!它表示"把项目文件建在当前目录",而不是再套一层文件夹。
你会看到生成了这些文件:
message_board/
manage.py
message_board/
__init__.py
settings.py ← 项目配置(比如数据库、时区)
urls.py ← 网站的"地图"(哪个网址对应什么功能)
asgi.py / wsgi.py
🧪 第 3 步:启动开发服务器(看看效果!)
运行:
bash
python manage.py runserver
你会看到类似:
Starting development server at http://127.0.0.1:8000/
现在打开浏览器,访问 👉 http://127.0.0.1:8000/
🎉 恭喜!你已经成功运行了一个 Django 网站!
你会看到一个火箭图标 + "The install worked successfully!" ------ 这是 Django 的欢迎页。
按 Ctrl + C 可以停止服务器(后面我们会再启动它)。
📝 第 4 步:创建一个"应用"(App)
Django 项目可以包含多个"应用"(App)。比如一个网站可能有"博客"、"用户系统"、"留言墙"等多个 App。
我们的留言墙就是一个 App。
运行:
bash
python manage.py startapp guestbook
我们给这个 App 起名叫
guestbook(注意不要和 Python 内置模块重名)
现在文件结构变成:
message_board/
├── manage.py
├── message_board/
└── guestbook/ ← 新增的 App 文件夹
├── models.py ← 数据模型(留言内容存哪?)
├── views.py ← 处理网页逻辑
├── apps.py
└── ...
🧩 第 5 步:告诉 Django 我们新建了 App
打开 message_board/settings.py,找到 INSTALLED_APPS,在列表里加上 'guestbook':
python
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'guestbook', # ← 加上这一行!
]
✅ 这一步很重要!否则 Django 不知道你的 App 存在。
💾 第 6 步:定义"留言"数据模型(Model)
我们要存用户的留言,比如:
- 留言内容(文字)
- 留言时间
打开 guestbook/models.py,改成这样:
python
from django.db import models
class GuestBook(models.Model):
content = models.TextField() # 留言内容(长文本)
created_at = models.DateTimeField(auto_now_add=True) # 自动记录创建时间
def __str__(self):
return self.content[:20] # 在后台显示前20个字
🔍
TextField()适合长文字,DateTimeField(auto_now_add=True)表示"创建时自动填当前时间"。
🗃️ 第 7 步:创建并应用数据库迁移
Django 会根据 Model 自动生成数据库表。我们需要两步:
1. 生成迁移文件
bash
python manage.py makemigrations
你会看到:Created new migration ... guestbook/migrations/0001_initial.py
2. 把变更应用到数据库
bash
python manage.py migrate
Django 默认用 SQLite(一个轻量级数据库,文件形式存在,无需额外安装)。
✅ 现在数据库里已经有 GuestBook 表了!
👀 第 8 步:写视图(View)------处理首页请求
我们希望:
- 用户访问首页时,看到所有留言
- 还能看到一个提交留言的表单
打开 guestbook/views.py,改成:b
python
from django.shortcuts import render, redirect
from .models import GuestBook
from django import forms
# 定义一个简单的表单
class GuestBookForm(forms.Form):
content = forms.CharField(widget=forms.Textarea(attrs={'rows': 3}))
def home(request):
if request.method == 'POST':
form = GuestBookForm(request.POST)
if form.is_valid():
GuestBook.objects.create(content=form.cleaned_data['content'])
return redirect('home') # 提交后刷新页面
else:
form = GuestBookForm()
messages = GuestBook.objects.all().order_by('-created_at')
return render(request, 'home.html', {'form': form, 'messages': messages})
🔍 这段代码的意思:
- 如果是"提交表单"(POST),就保存留言
- 否则(GET 请求),显示表单 + 所有留言(按时间倒序)
🌐 第 9 步:配置 URL 路由
我们需要让访问 /(首页)时调用上面的 home 视图。
1. 先在 guestbook App 里创建 urls.py
新建文件 guestbook/urls.py,内容如下:
python
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
]
2. 在主项目里包含这个路由
打开 message_board/urls.py,改成:
python
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('guestbook.urls')), # ← 包含 messages 的路由
]
✅ 现在访问根路径
/就会调用guestbook.views.home
🎨 第 10 步:创建网页模板(Template)
Django 默认从 templates 文件夹找模板。
1. 在 guestbook 文件夹里新建 templates 文件夹
guestbook/
└── templates/
└── home.html ← 我们要创建的文件
2. 编写 guestbook/templates/home.html
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我的留言墙</title>
<style>
body { font-family: Arial, sans-serif; max-width: 600px; margin: 40px auto; padding: 0 20px; }
.message { background: #f0f0f0; padding: 10px; margin: 10px 0; border-radius: 4px; }
textarea { width: 100%; }
button { margin-top: 10px; }
</style>
</head>
<body>
<h1>💬 留言墙</h1>
<!-- 显示所有留言 -->
{% for msg in messages %}
<div class="message">
{{ msg.content }}
<br><small>{{ msg.created_at|date:"Y-m-d H:i" }}</small>
</div>
{% empty %}
<p>还没有留言,快来抢沙发!</p>
{% endfor %}
<!-- 提交表单 -->
<h2>留下你的想法:</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">提交</button>
</form>
</body>
</html>
🔍 关键点:
{% for %}循环显示留言{% csrf_token %}是 Django 的安全机制(防跨站攻击),必须加!{``{ form.as_p }}自动渲染表单为段落
▶️ 第 11 步:运行网站,试试看!
回到终端,确保你在项目根目录(有 manage.py 的地方),运行:
bash
python manage.py runserver
然后打开浏览器访问:http://127.0.0.1:8000
你应该看到:
- 一个标题"留言墙"
- 一个空白区域(因为还没留言)
- 一个文本框 + "提交"按钮
✅ 试试输入"Hello Django!",点击提交!
刷新页面,你会发现留言出现了,并且带时间!
🔐 额外彩蛋:启用 Django 后台(Admin)
Django 自带超级强大的管理后台!
1. 创建管理员账号
bash
python manage.py createsuperuser
按提示输入用户名、邮箱、密码(密码输入时不会显示,正常输就行)。
2. 注册 GuestBook模型到后台
打开 guestbook/admin.py,改成:
python
from django.contrib import admin
from .models import GuestBook
admin.site.register(GuestBook)
3. 访问后台
启动服务器后,访问:http://127.0.0.1:8000/admin
用刚才创建的账号登录,你就能:
- 查看所有留言
- 添加、编辑、删除留言
- 甚至导出数据!
这就是 Django 的魔力------几乎不用写代码,就得到了一个完整的管理界面!
🎉 恭喜你!你刚刚亲手做出了一个完整的 Web 应用!
虽然简单,但它包含了:
- 数据存储(Model)
- 网页逻辑(View)
- 用户界面(Template)
- 表单处理
- 数据库
- 后台管理
这正是 Django 的核心工作流!
📚 下一步你可以尝试:
错误处理:
这个错误信息:
Application labels aren't unique, duplicates: messages
意思是:你的 Django 项目中,有两个或多个应用(App)使用了相同的名称 messages,而 Django 要求每个 App 的"标签"(label)必须是唯一的。
🧠 为什么会这样?
Django 通过 App 的名字(也就是 label) 来区分不同的应用。这个 label 默认就是你创建 App 时用的文件夹名。
常见原因:
-
你创建了一个叫
messages的 App比如你运行了:
bashpython manage.py startapp messages -
但 Django 内置已经有一个叫
django.contrib.messages的 App!它是用来处理"一次性通知消息"(比如"操作成功!"、"登录失败"这类提示)的。
-
你在
settings.py的INSTALLED_APPS里同时启用了这两个同名的 App→ Django 就懵了:"到底哪个是
messages?"
✅ 解决方法:不要把你的 App 叫 messages!
这是最简单、最安全的做法。
步骤如下:
1. 删除或重命名你的 App 文件夹
比如改成 guestbook 或 leavemsg:
bash
# 如果你还没写太多代码,可以直接删掉
rm -rf messages/ # Mac/Linux
rmdir /s messages # Windows (CMD)
或者重命名(推荐):
bash
mv messages guestbook # Mac/Linux
ren messages guestbook # Windows
2. 重新创建一个不冲突的 App(可选)
bash
python manage.py startapp guestbook
然后把你原来在 messages/models.py、views.py 等文件里的代码,复制到 guestbook/ 对应的文件中。
3. 更新 settings.py
把 INSTALLED_APPS 里的 'messages' 改成 'guestbook':
python
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages', # ← 这是 Django 内置的,保留!
'django.contrib.staticfiles',
'guestbook', # ← 你的 App,改名后加这个
]
4. 更新路由(urls.py)
如果你在主 urls.py 里写了:
python
path('', include('messages.urls')),
要改成:
python
path('', include('guestbook.urls')),
5. 删除旧的数据库迁移(重要!)
因为之前用 messages 生成过迁移,现在 App 名变了,需要清理:
bash
# 删除 migrations 文件夹下的 0001_initial.py 等文件(保留 __init__.py)
rm guestbook/migrations/0*.py # 如果你已重命名为 guestbook
# 或者直接删整个 migrations 文件夹(除了 __init__.py)
然后重新生成迁移:
bash
python manage.py makemigrations guestbook
python manage.py migrate
💡 如果你用的是 SQLite(默认),也可以直接删除
db.sqlite3文件,然后重新migrate(适合开发阶段)。
🔒 为什么不能叫 messages?
因为 django.contrib.messages 是 Django 官方组件,它的 label 就是 'messages'。
当你自己的 App 也叫 messages,Django 在内部注册时就会冲突。
⚠️ 其他容易冲突的名字还有:
auth,admin,contenttypes,sessions,staticfiles等------都不要用这些做你自己的 App 名!
✅ 推荐的 App 命名
guestbook(留言簿)leavemsgcommentswallmyapp
只要不是 Django 内置组件的名字 ,并且语义清晰就行。
总结
| 问题 | 原因 | 解决方案 |
|---|---|---|
Application labels aren't unique, duplicates: messages |
你的 App 和 Django 内置 messages 同名 |
重命名你的 App(如 guestbook),更新所有引用 |
如果你已经按上面改好了,再运行:
bash
python manage.py runserver
应该就不会报错了!