Django 教程

我们用最通俗、最生活化的方式来聊聊 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 的"工作流程":
    1. 用户访问网址 →
    2. Django 根据 URL 找到对应的 View →
    3. View 从 Model 获取数据 →
    4. View 把数据塞进 Template →
    5. 最终生成 HTML 返回给用户

类似于"顾客点单 → 服务员接单 → 厨房做菜 → 上菜"。

✅ 2. "约定优于配置"

  • Django 有一套默认规则(比如项目结构、文件命名),你只要遵守,它就能自动工作。
  • 不需要写一堆配置文件告诉它"我的数据库在哪""模板放哪"------它已经猜好了!

✅ 3. 快速开发 + 可扩展

  • 小项目:几天就能做出带后台的完整网站。
  • 大项目:Instagram、Pinterest 都用 Django 支撑亿级用户!

🌰 五、举个真实例子:做个"待办事项"网站

假设你想做一个 Todo 应用:

  1. 定义 Model(数据):

    python 复制代码
    class Task(models.Model):
        title = models.CharField(max_length=100)
        done = models.BooleanField(default=False)

    → Django 自动创建数据库表!

  2. 写 View(逻辑):

    python 复制代码
    def task_list(request):
        tasks = Task.objects.all()
        return render(request, 'tasks.html', {'tasks': tasks})
  3. 做 Template(页面):

    html 复制代码
    <!-- tasks.html -->
    <ul>
      {% for task in tasks %}
        <li>{{ task.title }} {% if task.done %}✅{% endif %}</li>
      {% endfor %}
    </ul>
  4. 配置 URL

    python 复制代码
    path('tasks/', views.task_list)
  5. 运行 → 访问 /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 的核心工作流!


📚 下一步你可以尝试:

  1. 给留言加"作者名字"字段
  2. 限制留言长度
  3. 部署到互联网(比如用 RenderVercel 免费部署)
  4. 学习 Django 的用户系统(注册/登录)

错误处理:

这个错误信息:

Application labels aren't unique, duplicates: messages

意思是:你的 Django 项目中,有两个或多个应用(App)使用了相同的名称 messages,而 Django 要求每个 App 的"标签"(label)必须是唯一的。


🧠 为什么会这样?

Django 通过 App 的名字(也就是 label) 来区分不同的应用。这个 label 默认就是你创建 App 时用的文件夹名。

常见原因:

  1. 你创建了一个叫 messages 的 App

    比如你运行了:

    bash 复制代码
    python manage.py startapp messages
  2. 但 Django 内置已经有一个叫 django.contrib.messages 的 App!

    它是用来处理"一次性通知消息"(比如"操作成功!"、"登录失败"这类提示)的。

  3. 你在 settings.pyINSTALLED_APPS 里同时启用了这两个同名的 App

    → Django 就懵了:"到底哪个是 messages?"


✅ 解决方法:不要把你的 App 叫 messages

这是最简单、最安全的做法。

步骤如下:

1. 删除或重命名你的 App 文件夹

比如改成 guestbookleavemsg

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.pyviews.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(留言簿)
  • leavemsg
  • comments
  • wall
  • myapp

只要不是 Django 内置组件的名字 ,并且语义清晰就行。


总结

问题 原因 解决方案
Application labels aren't unique, duplicates: messages 你的 App 和 Django 内置 messages 同名 重命名你的 App(如 guestbook),更新所有引用

如果你已经按上面改好了,再运行:

bash 复制代码
python manage.py runserver

应该就不会报错了!

相关推荐
少云清1 小时前
【安全测试】5_应用服务器安全性测试 _SQL注入和文件上传漏洞
数据库·sql·安全性测试
eWidget1 小时前
核心业务系统国产化:如何破解 Oracle 迁移中的“重构代价”与“性能瓶颈”?
数据库·oracle·重构·kingbase·数据库平替用金仓·金仓数据库
lhxsir1 小时前
oracle常用命令(DBA)
数据库·oracle·dba
Elastic 中国社区官方博客1 小时前
Elasticsearch 8.17.2 升级到 9.2.4 完整升级过程
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·运维开发
Re.不晚1 小时前
Redis事务
数据库·redis·php
数据知道2 小时前
PostgreSQL:如何定期验证备份的有效性?(灾备演练)
数据库·postgresql
档案宝档案管理2 小时前
档案管理系统软件:档案宝让企业实现高效档案利用与精准数据分析
大数据·数据库·人工智能·档案·档案管理
eWidget2 小时前
核心业务系统“去O”实战:如何破解语法兼容与逻辑重构难题?核心业务系统“去O”实战:如何破解语法兼容与逻辑重构难题?
数据库·oracle·重构·kingbase·数据库平替用金仓·金仓数据库
2501_941982052 小时前
Python开发:外部群消息自动回复
java·前端·数据库