一份不可多得的 《 Django 》 零基础入门教程

Django 零基础入门教程

Django 是 Python 生态中最成熟、最强大的全栈 Web 框架

遵循「电池已内置」(Batteries Included)理念 , 内置 ORM、Admin 后台、用户认证、表单验证等全套功能 , 适合快速开发从个人项目到企业级应用的各类 Web 系统。

本教程从环境搭建到完整项目实战,带你零基础掌握 Django 核心用法。

一、前置准备

1.1 环境要求

  • Python 3.8+(Django 4.x 及以上版本推荐,兼容更好)
  • pip(Python 包管理工具,默认随 Python 安装)
  • 操作系统:Windows/macOS/Linux 均可(本教程以 macOS/Linux 为例,Windows 仅命令行略有差异)

1.2 安装 Django

打开终端/命令提示符,执行以下命令安装最新稳定版 Django:

bash 复制代码
# 安装最新版
pip install django

# 验证安装(查看版本,当前稳定版为 5.0+)
django-admin --version

可选:用虚拟环境隔离项目依赖(推荐)

bash 复制代码
# 创建虚拟环境
python -m venv django_env
# 激活虚拟环境(macOS/Linux)
source django_env/bin/activate
# 激活虚拟环境(Windows)
django_env\Scripts\activate
# 激活后再安装 Django
pip install django

二、Django 核心概念

在开始写代码前,先理解 Django 的核心设计理念和架构:

2.1 MTV 架构

Django 采用 MTV 模式(对应传统 MVC 架构),职责划分清晰:

组件 全称 作用 对应 MVC 中的角色
Model(模型) 数据模型 定义数据结构,操作数据库(增删改查) Model
Template(模板) 模板文件 定义页面展示样式(HTML+模板语法) View
View(视图) 视图函数/类 处理业务逻辑,连接 Model 和 Template Controller

2.2 项目与应用

  • 项目(Project):一个完整的 Django 应用程序,包含全局配置、路由总入口、数据库配置等。
  • 应用(App):项目的功能模块(如用户模块、商品模块),一个项目可包含多个 App,便于代码解耦。

2.3 核心组件

  • URLconf:路由配置,映射 URL 地址到对应的视图函数。
  • ORM:对象关系映射,用 Python 类操作数据库,无需写原生 SQL。
  • Admin:自动生成的后台管理界面,快速管理数据库数据。
  • Form:表单验证,处理前端提交的数据,自动校验合法性。

三、快速创建第一个 Django 项目

3.1 创建项目

执行以下命令创建名为 myfirstsite 的 Django 项目:

bash 复制代码
django-admin startproject myfirstsite

执行后会生成如下目录结构:

bash 复制代码
myfirstsite/          # 项目根目录
├── manage.py         # 项目管理脚本(启动服务、创建App、数据库迁移等)
└── myfirstsite/      # 项目核心配置目录
    ├── __init__.py
    ├── asgi.py       # ASGI 配置,适配异步 Web 服务器
    ├── settings.py   # 全局配置文件(数据库、静态文件、应用注册等)
    ├── urls.py       # 路由总入口
    └── wsgi.py       # WSGI 配置,适配传统 Web 服务器

3.2 创建应用

进入项目根目录,创建名为 blog 的应用(后续以博客功能为例):

bash 复制代码
cd myfirstsite
python manage.py startapp blog

生成的 blog 目录结构:

bash 复制代码
blog/
├── __init__.py
├── admin.py       # 配置 Admin 后台
├── apps.py        # 应用配置
├── migrations/    # 数据库迁移文件(自动生成)
├── models.py      # 数据模型
├── tests.py       # 单元测试
└── views.py       # 视图函数

3.3 注册应用

打开 myfirstsite/settings.py,在 INSTALLED_APPS 中添加 blog 应用(Django 仅加载注册的应用):

python 复制代码
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',  # 新增:注册 blog 应用
]

3.4 启动开发服务器

执行以下命令启动 Django 内置的开发服务器:

bash 复制代码
python manage.py runserver

终端输出如下信息表示启动成功:

sql 复制代码
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
Django version 5.0, using settings 'myfirstsite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

打开浏览器访问 http://127.0.0.1:8000/,看到 Django 默认欢迎页面,说明环境搭建成功。

四、核心功能实战:搭建简易博客

4.1 定义数据模型(Model)

打开 blog/models.py,定义博客文章(Article)模型,对应数据库中的 blog_article 表:

python 复制代码
from django.db import models
from django.contrib.auth.models import User  # 内置用户模型

# 博客文章模型
class Article(models.Model):
    # 标题:字符串类型,最大长度 200,不允许为空
    title = models.CharField(max_length=200, verbose_name="文章标题")
    # 内容:文本类型,可存储大段文字
    content = models.TextField(verbose_name="文章内容")
    # 发布时间:自动设置为创建时间,无需手动赋值
    pub_time = models.DateTimeField(auto_now_add=True, verbose_name="发布时间")
    # 作者:关联内置 User 模型,一篇文章属于一个用户,用户删除则文章也删除(on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")

    # 自定义显示名称(Admin 后台和终端中更易识别)
    def __str__(self):
        return self.title

    # 元数据:设置模型的额外属性
    class Meta:
        verbose_name = "文章"
        verbose_name_plural = "文章"  # 复数形式(避免 Admin 显示为"Articles")
        ordering = ["-pub_time"]  # 按发布时间倒序排列(最新的在前)

4.2 数据库迁移

Django 通过「迁移文件」管理数据库结构,执行以下命令将模型同步到数据库:

bash 复制代码
# 生成迁移文件(记录模型的变化)
python manage.py makemigrations

# 执行迁移(将模型创建为数据库表)
python manage.py migrate

说明:Django 默认使用 SQLite 数据库(无需额外配置),适合开发阶段;生产环境可替换为 MySQL/PostgreSQL(后续会讲)。

4.3 配置 Admin 后台

Django 内置的 Admin 后台可快速管理数据库数据,无需手动写增删改查页面。

4.3.1 注册模型到 Admin

打开 blog/admin.py,注册 Article 模型:

python 复制代码
from django.contrib import admin
from .models import Article

# 注册 Article 模型
admin.site.register(Article)

4.3.2 创建超级用户(Admin 登录账号)

执行以下命令,按提示输入用户名、邮箱、密码:

bash 复制代码
python manage.py createsuperuser

示例:

perl 复制代码
Username (leave blank to use 'yourname'): admin
Email address: admin@example.com
Password: 输入强密码(如 Admin123!)
Password (again): 重复密码
Superuser created successfully.

4.3.3 访问 Admin 后台

重启开发服务器,访问 http://127.0.0.1:8000/admin/,输入超级用户账号密码登录。

登录后可看到「Articles」选项,点击即可添加、编辑、删除博客文章------这就是 Django 「电池已内置」的体现,几行代码实现完整的后台管理功能。

4.4 编写视图函数(View)

视图函数负责处理业务逻辑,接收请求并返回响应。

4.4.1 基础视图:展示所有文章

打开 blog/views.py,编写视图函数:

python 复制代码
from django.shortcuts import render
from .models import Article

# 展示所有文章列表
def article_list(request):
    # 从数据库查询所有文章(按发布时间倒序)
    articles = Article.objects.all()
    # 将文章数据传递给模板
    return render(request, 'blog/article_list.html', {'articles': articles})

# 展示单篇文章详情
def article_detail(request, article_id):
    # 根据 ID 查询单篇文章,若不存在则返回 404
    article = Article.objects.get(id=article_id)
    return render(request, 'blog/article_detail.html', {'article': article})

4.5 配置路由(URLconf)

路由负责映射 URL 到视图函数,分为「项目总路由」和「应用子路由」(推荐解耦)。

4.5.1 应用子路由

blog 目录下创建 urls.py 文件,编写应用内路由:

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    # 文章列表页:http://127.0.0.1:8000/blog/
    path('', views.article_list, name='article_list'),
    # 文章详情页:http://127.0.0.1:8000/blog/1/(1 为文章 ID)
    path('<int:article_id>/', views.article_detail, name='article_detail'),
]

4.5.2 项目总路由

打开 myfirstsite/urls.py,将应用路由挂载到总路由:

python 复制代码
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),  # Admin 后台路由
    path('blog/', include('blog.urls')),  # 挂载 blog 应用路由
]

4.6 编写模板(Template)

模板负责页面展示,使用 Django 模板语法将视图传递的数据渲染为 HTML。

4.6.1 创建模板目录

按以下结构创建模板目录(Django 默认读取 templates 目录下的模板):

bash 复制代码
myfirstsite/
├── blog/
│   └── templates/  # 应用级模板目录(推荐)
│       └── blog/
│           ├── article_list.html  # 文章列表模板
│           └── article_detail.html # 文章详情模板
└── manage.py

4.6.2 文章列表模板(article_list.html)

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>我的博客</title>
    <style>
        .article { margin: 20px 0; padding: 10px; border-bottom: 1px solid #eee; }
        .title { font-size: 18px; color: #2c3e50; }
        .pub-time { color: #999; font-size: 12px; }
    </style>
</head>
<body>
    <h1>我的博客</h1>
    {% if articles %}
        {% for article in articles %}
            <div class="article">
                <h2 class="title">
                    <a href="{% url 'article_detail' article.id %}">{{ article.title }}</a>
                </h2>
                <p class="pub-time">发布时间:{{ article.pub_time|date:"Y-m-d H:i" }}</p>
                <p>作者:{{ article.author.username }}</p>
                <p>{{ article.content|truncatechars:200 }}</p> <!-- 截取前200个字符 -->
            </div>
        {% endfor %}
    {% else %}
        <p>暂无文章,快去后台添加吧!</p>
    {% endif %}
</body>
</html>

4.6.3 文章详情模板(article_detail.html)

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{{ article.title }} - 我的博客</title>
</head>
<body>
    <h1>{{ article.title }}</h1>
    <p>发布时间:{{ article.pub_time|date:"Y-m-d H:i" }} | 作者:{{ article.author.username }}</p>
    <hr>
    <div>{{ article.content|linebreaks }}</div> <!-- linebreaks 转换换行符为 <br> -->
    <br>
    <a href="{% url 'article_list' %}">返回首页</a>
</body>
</html>

4.7 测试功能

  1. 先通过 Admin 后台(http://127.0.0.1:8000/admin/)添加几篇测试文章;
  2. 访问 http://127.0.0.1:8000/blog/,可看到文章列表;
  3. 点击文章标题,进入详情页查看完整内容。

至此,一个简易的博客系统已完成,包含「后台管理+前台展示」核心功能。

五、进阶功能:表单、用户认证与静态文件

5.1 静态文件配置(CSS/JS/图片)

Django 需配置静态文件目录,才能加载 CSS、JS、图片等资源。

5.1.1 创建静态文件目录

blog 目录下创建 static/blog/ 目录,用于存放该应用的静态文件:

csharp 复制代码
blog/
└── static/
    └── blog/
        ├── css/
        │   └── style.css  # 自定义样式
        └── images/
            └── logo.png   # 示例图片

5.1.2 配置静态文件路径

打开 myfirstsite/settings.py,确认以下配置(默认已开启):

python 复制代码
# 静态文件 URL 前缀
STATIC_URL = 'static/'

# 开发阶段静态文件目录(生产环境需收集到统一目录)
STATICFILES_DIRS = [
    BASE_DIR / "static",  # 项目级静态文件目录(可选)
]

5.1.3 在模板中引用静态文件

修改 article_list.html,引入自定义 CSS:

html 复制代码
{% load static %}  <!-- 加载静态文件标签 -->
<head>
    <meta charset="UTF-8">
    <title>我的博客</title>
    <!-- 引用静态 CSS 文件 -->
    <link rel="stylesheet" href="{% static 'blog/css/style.css' %}">
</head>
<body>
    <!-- 引用静态图片 -->
    <img src="{% static 'blog/images/logo.png' %}" alt="博客logo" width="100">
    <!-- 其余内容不变 -->
</body>

5.2 表单:添加文章评论功能

5.2.1 定义评论模型

打开 blog/models.py,新增 Comment 模型:

python 复制代码
class Comment(models.Model):
    # 评论内容
    content = models.TextField(verbose_name="评论内容")
    # 评论时间
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="评论时间")
    # 关联文章(一篇文章可有多个评论)
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name="comments", verbose_name="所属文章")
    # 关联用户(可选,匿名评论可去掉)
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="评论者")

    def __str__(self):
        return f"{self.author.username} 评论:{self.content[:20]}"

    class Meta:
        verbose_name = "评论"
        verbose_name_plural = "评论"
        ordering = ["-create_time"]

执行数据库迁移:

bash 复制代码
python manage.py makemigrations
python manage.py migrate

5.2.2 定义评论表单

blog 目录下创建 forms.py,编写表单验证:

python 复制代码
from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    # 自定义表单字段(可选,用于调整显示)
    content = forms.CharField(widget=forms.Textarea(attrs={"rows": 3, "placeholder": "请输入评论..."}), label="")

    class Meta:
        model = Comment  # 基于 Comment 模型创建表单
        fields = ["content"]  # 只显示 content 字段

5.2.3 修改视图:处理评论提交

更新 blog/views.pyarticle_detail 视图,添加表单处理逻辑:

python 复制代码
from .forms import CommentForm

def article_detail(request, article_id):
    article = Article.objects.get(id=article_id)
    # 处理评论提交
    if request.method == "POST":
        # 验证用户是否登录(未登录则跳转到登录页)
        if not request.user.is_authenticated:
            from django.shortcuts import redirect
            return redirect(f"/admin/login/?next=/blog/{article_id}/")
        
        # 绑定表单数据
        form = CommentForm(request.POST)
        if form.is_valid():  # 验证数据合法性
            comment = form.save(commit=False)  # 不立即保存到数据库
            comment.article = article  # 关联所属文章
            comment.author = request.user  # 关联评论者(当前登录用户)
            comment.save()  # 保存到数据库
            # 刷新页面(避免重复提交)
            from django.shortcuts import redirect
            return redirect(f"/blog/{article_id}/")
    else:
        # GET 请求:初始化空表单
        form = CommentForm()
    
    # 查询该文章的所有评论
    comments = article.comments.all()
    return render(request, 'blog/article_detail.html', {
        'article': article,
        'form': form,
        'comments': comments
    })

5.2.4 修改详情模板:添加评论表单和评论列表

更新 article_detail.html

html 复制代码
{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{{ article.title }} - 我的博客</title>
    <link rel="stylesheet" href="{% static 'blog/css/style.css' %}">
</head>
<body>
    <h1>{{ article.title }}</h1>
    <p>发布时间:{{ article.pub_time|date:"Y-m-d H:i" }} | 作者:{{ article.author.username }}</p>
    <hr>
    <div>{{ article.content|linebreaks }}</div>
    <br>
    
    <!-- 评论表单 -->
    <h3>评论区</h3>
    <form method="POST">
        {% csrf_token %}  <!-- Django 必加:防止跨站请求伪造 -->
        {{ form.as_p }}   <!-- 渲染表单 -->
        <button type="submit">提交评论</button>
    </form>
    
    <!-- 评论列表 -->
    {% if comments %}
        <div style="margin-top: 20px;">
            {% for comment in comments %}
                <div style="margin: 10px 0; padding: 10px; background: #f9f9f9;">
                    <p><strong>{{ comment.author.username }}</strong> {{ comment.create_time|date:"Y-m-d H:i" }}</p>
                    <p>{{ comment.content|linebreaks }}</p>
                </div>
            {% endfor %}
        </div>
    {% endif %}
    
    <br>
    <a href="{% url 'article_list' %}">返回首页</a>
</body>
</html>

5.3 用户认证(扩展)

Django 内置完整的用户认证系统,无需手动实现登录/注册:

  • 登录页:http://127.0.0.1:8000/admin/login/(Admin 自带);
  • 若需自定义登录页,可使用 django.contrib.auth 模块的 login/logout 函数;
  • 视图中通过 request.user 判断用户是否登录,request.user.is_authenticated 返回布尔值。

六、生产环境配置(简要)

开发完成后,需调整配置适配生产环境:

6.1 数据库切换为 MySQL

  1. 安装 MySQL 驱动:pip install mysqlclient
  2. 修改 settings.py 的数据库配置:
python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myfirstsite',  # 数据库名
        'USER': 'root',         # MySQL 用户名
        'PASSWORD': 'your_mysql_password',  # MySQL 密码
        'HOST': '127.0.0.1',    # 数据库地址
        'PORT': '3306',         # 端口
        'CHARSET': 'utf8mb4',   # 字符集(支持emoji)
    }
}

6.2 关闭 DEBUG 模式

python 复制代码
# settings.py
DEBUG = False  # 生产环境必须关闭
ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com']  # 允许访问的域名

6.3 收集静态文件

bash 复制代码
python manage.py collectstatic  # 将所有静态文件收集到 STATIC_ROOT 目录

6.4 部署方式

  • 小型应用:Gunicorn + Nginx;
  • 大型应用:Docker + Kubernetes 或云服务(阿里云 ECS、腾讯云轻量应用服务器)。

七、常见问题与解决方案

  1. 报错:CSRF token missing or incorrect

    原因:表单未加 {% csrf_token %}

    解决:在 POST 表单中添加 {% csrf_token %} 标签。

  2. 报错:DoesNotExist: Article matching query does not exist

    原因:访问了不存在的文章 ID;

    解决:使用 get_object_or_404 替代 get

    python 复制代码
    from django.shortcuts import get_object_or_404
    article = get_object_or_404(Article, id=article_id)
  3. 静态文件加载失败

    原因:未配置 STATIC_URL 或未加载 {% load static %}

    解决:确认 settings.py 配置,模板开头添加 {% load static %}

八、学习资源与进阶方向

8.1 官方资源

8.2 进阶方向

  1. 类视图(Class-Based Views):替代函数视图,复用性更高;
  2. Django REST Framework:开发 RESTful API,适配前后端分离;
  3. 中间件(Middleware):处理全局请求/响应(如日志、权限验证);
  4. 缓存与性能优化:使用 Redis 缓存高频访问数据;
  5. Celery 异步任务:处理耗时任务(如邮件发送、数据导出)。

总结

  1. 核心流程:Django 开发遵循「定义模型→数据库迁移→编写视图→配置路由→编写模板」的固定流程,MTV 架构让代码职责清晰;
  2. 核心优势:内置 Admin 后台、ORM、表单验证等功能,无需重复造轮子,开发效率极高;
  3. 学习路径:先掌握基础的「模型-视图-模板」,再逐步扩展表单、用户认证、静态文件,最后学习生产环境部署和性能优化。

Django 的生态足够支撑从个人博客到企业级电商平台的所有开发需求,掌握核心用法后,可结合实际项目持续进阶。

相关推荐
￰meteor20 小时前
23种设计模式 -【工厂方法】
后端
LongJ_Sir20 小时前
视觉识别算法demo
python
智算菩萨21 小时前
【论文复现】ML-MLM:基于PyTorch的多标签极小学习机完整复现教程(附GPT-5.4辅助科研提示词工程)
人工智能·pytorch·python·gpt·深度学习·论文笔记
Vertira21 小时前
torch.eq、torch.ne、torch.gt、torch.lt、torch.ge、torch.le 等函数详解
pytorch·python·深度学习
bjzhang7521 小时前
SpringCloud——国产化改造,项目对接 TongWeb 嵌入版
后端·spring·spring cloud
高频交易dragon21 小时前
claude实现缠论(买卖点)
大数据·python
Hello.Reader21 小时前
Spark 4.0 新特性Python Data Source API 快速上手
python·ajax·spark
光影少年21 小时前
平时如何学习新技术?
后端·学习·前端框架
鹏程十八少21 小时前
9. Android Shadow插件化如何解决资源冲突问题和实现tinker热修复资源(源码分析4)
android·前端·面试
csdn2015_21 小时前
springboot controller 参数可以是List吗
spring boot·后端·list