作为 Python 生态中最成熟的 Web 框架,Django 以 "电池已内置" 的设计哲学,让开发者无需重复造轮子就能快速构建高性能 Web 应用。本文整理了 Django 完整学习体系,从环境搭建到最佳实践,涵盖核心知识点与实战技巧,助力零基础开发者快速上手,进阶玩家夯实基础。
一、环境搭建与项目初始化:迈出第一步
1.1 虚拟环境:隔离依赖的 "安全区"
不同项目对包版本的需求可能冲突(如 A 项目需 Django 3.2,B 项目需 4.2),虚拟环境能为每个项目创建独立的依赖空间,避免版本混乱。
- 创建命令:
python -m venv django_env - 激活方式:
- Windows:
django_env\Scripts\activate - Mac/Linux:
source django_env/bin/activate
- Windows:
1.2 Django 安装与验证
激活虚拟环境后,通过 pip 快速安装并验证版本:
bash
运行
pip install django # 安装最新稳定版python
运行
import django print(django.get_version()) # 输出4.2+即为成功1.3 项目创建与目录解析
bash
运行
django-admin startproject mysite . # 末尾的"."表示在当前目录创建生成的项目结构清晰明了,核心文件功能如下:
plaintext
mysite/ ├── manage.py # 项目管理脚本(启动服务、数据库迁移等) └── mysite/ ├── __init__.py # 空文件,标识为Python包 ├── settings.py # 项目核心配置文件 ├── urls.py # 根URL路由配置 ├── asgi.py # ASGI异步部署配置 └── wsgi.py # WSGI部署配置二、核心配置详解:玩转 settings.py
settings.py 是 Django 项目的 "控制面板",掌握关键配置能让开发事半功倍。
2.1 必知配置变量表
| 变量名 | 默认值 | 关键说明 |
|---|---|---|
| DEBUG | True | 调试模式(开发时开启,上线必须设为 False,避免暴露敏感信息) |
| ALLOWED_HOSTS | [] | 允许访问的域名 / IP,生产环境需填写真实域名(如 ['www.example.com']) |
| INSTALLED_APPS | [...] | 已安装的应用列表,新建 app 后需手动添加至此 |
| DATABASES | SQLite 默认配置 | 数据库连接信息,支持 MySQL、PostgreSQL 等切换 |
| TEMPLATES | DIRS: [] | 模板文件搜索路径,需手动添加BASE_DIR / "templates" |
| STATIC_URL | 'static/' | 静态文件(CSS/JS/ 图片)URL 前缀 |
| LANGUAGE_CODE | 'en-us' | 语言设置,中文需改为 'zh-hans' |
| TIME_ZONE | 'UTC' | 时区设置,国内改为 'Asia/Shanghai' |
2.2 静态文件配置技巧
- 开发阶段:指定静态文件存放目录
python
运行
STATICFILES_DIRS = [ BASE_DIR / "static", # 项目根目录下的static文件夹 ]- 生产阶段:收集所有静态文件到统一目录
python
运行
STATIC_ROOT = BASE_DIR / "staticfiles" # 执行collectstatic时的输出目录三、视图与 URL 路由:Web 应用的 "导航系统"
视图负责处理请求并返回响应,URL 路由负责将请求分发到对应的视图,二者配合是 Django 的核心工作流。
3.1 视图函数基础示例
在 app 目录下创建 views.py,编写第一个视图:
python
运行
from django.http import HttpResponse def hello(request): # request参数封装了所有请求信息(如请求方法、参数等) return HttpResponse("Hello, Django! 这是我的第一个视图响应~")3.2 路由配置:从根到应用的分发
(1)根路由配置(mysite/urls.py)
python
运行
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # Django自带的后台管理路由 path('polls/', include('polls.urls')), # 将/polls/开头的请求分发到polls应用 ](2)应用级路由配置(polls/urls.py)
新建 polls 应用的 urls.py,实现更精细的路由控制:
python
运行
from django.urls import path from . import views app_name = 'polls' # 命名空间,避免不同app路由重名冲突 urlpatterns = [ path('', views.index, name='index'), # 首页:/polls/ path('<<int:question_id>/', views.detail, name='detail'), # 动态路由:/polls/1/ path('<<int:question_id>/results/', views.results, name='results'), # 结果页 path('<<int:question_id>/vote/', views.vote, name='vote'), # 投票页 ]四、模型与数据库:数据存储的 "核心引擎"
Django ORM(对象关系映射)让开发者无需编写原生 SQL,就能通过 Python 类操作数据库。
4.1 定义模型类(models.py)
以投票应用为例,定义 Question(问题)和 Choice(选项)两个模型:
python
运行
from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200, verbose_name="问题内容") pub_date = models.DateTimeField("发布日期", auto_now_add=True) # 自动记录创建时间 def __str__(self): return self.question_text # 后台显示模型实例时的名称 class Meta: verbose_name = "问题" verbose_name_plural = "问题" # 复数形式(避免默认加s) class Choice(models.Model): # 外键关联Question,级联删除(删除问题时同步删除选项) question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200, verbose_name="选项内容") votes = models.IntegerField(default=0, verbose_name="票数") def __str__(self): return self.choice_text4.2 数据库迁移:同步模型与数据库
bash
运行
python manage.py makemigrations # 根据模型变化生成迁移文件 python manage.py migrate # 执行迁移,创建/更新数据库表⚠️ 注意:每次修改 models.py 后,都需执行上述两步命令同步数据库。
五、Django Admin:5 分钟搭建后台管理系统
Django 自带强大的后台管理界面,无需编写前端代码就能实现数据增删改查。
5.1 创建管理员账户
bash
运行
python manage.py createsuperuser # 按提示输入用户名、邮箱、密码5.2 注册模型到后台
在 app 的 admin.py 中注册模型,自定义后台显示效果:
python
运行
from django.contrib import admin from .models import Question, Choice # 内嵌选项表单(在编辑问题时可直接添加选项) class ChoiceInline(admin.TabularInline): model = Choice extra = 3 # 默认显示3个选项输入框 @admin.register(Question) # 装饰器注册模型 class QuestionAdmin(admin.ModelAdmin): list_display = ('question_text', 'pub_date', 'was_published_recently') # 列表页显示字段 list_filter = ['pub_date'] # 过滤条件 search_fields = ['question_text'] # 搜索框(按问题内容搜索) date_hierarchy = 'pub_date' # 日期分层导航 inlines = [ChoiceInline] # 内嵌选项表单启动服务后,访问http://127.0.0.1:8000/admin/,使用管理员账户登录即可管理数据。
六、模板系统:快速构建美观前端
Django 模板系统支持变量、标签、过滤器等功能,还能实现模板继承,大幅提高前端开发效率。
6.1 核心模板语法
- 变量:
{{ variable }}(渲染视图传递的数据) - 标签:
{% tag %}(控制逻辑,如循环、条件判断) - 过滤器:
{{ value|filter }}(数据处理,如{{ name|upper }}转为大写)
6.2 模板继承:复用公共布局
(1)父模板(templates/base.html)
定义网站公共布局(导航栏、页脚等):
html
预览
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>{% block title %}默认标题{% endblock %}</title> <link rel="stylesheet" href="/static/css/style.css"> <!-- 引入静态文件 --> </head> <body> <header> <nav>网站导航:<a href="/">首页</a> | <a href="/polls/">投票</a></nav> </header> <main> {% block content %} <!-- 子模板填充内容 --> {% endblock %} </main> <footer>© 2024 我的Django网站 版权所有</footer> </body> </html>(2)子模板(templates/polls/index.html)
继承父模板并填充个性化内容:
html
预览
{% extends "base.html" %} <!-- 继承父模板 --> {% block title %}投票首页 - 我的网站{% endblock %} <!-- 重写标题块 --> {% block content %} <h1>热门投票</h1> {% if latest_question_list %} <ul> {% for question in latest_question_list %} <!-- 循环渲染问题列表 --> <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>暂无投票活动~</p> {% endif %} {% endblock %}七、表单与用户交互:处理请求数据
Web 应用的核心是交互,Django 提供了简洁的方式处理 GET/POST 请求,实现用户数据提交。
7.1 投票功能实战示例
python
运行
from django.shortcuts import render, get_object_or_404, redirect from .models import Question, Choice def vote(request, question_id): # 获取问题实例,不存在则返回404 question = get_object_or_404(Question, pk=question_id) if request.method == 'POST': try: # 获取用户选择的选项(从POST数据中提取) selected_choice = question.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): # 无选择时返回错误信息 return render(request, 'polls/detail.html', { 'question': question, 'error_message': "你没有选择任何选项!", }) else: selected_choice.votes += 1 selected_choice.save() # 保存票数 # 重定向到结果页(避免刷新重复提交) return redirect('polls:results', question_id=question.id) # GET请求时渲染投票页面 return render(request, 'polls/detail.html', {'question': question})八、最佳实践:写出高质量 Django 项目
8.1 项目结构规范
- 每个功能模块独立为一个 app,保持代码模块化
- 静态文件按类型分类(static/css、static/js、static/img)
- 模板文件按 app 划分(templates/polls、templates/blog)
8.2 开发与部署技巧
- 开发阶段使用
python manage.py runserver启动服务,支持自动重载 - 生产环境关闭 DEBUG,配置 ALLOWED_HOSTS,使用 Gunicorn+Nginx 部署
- 静态文件通过
python manage.py collectstatic收集后,由 Nginx 提供服务
8.3 数据库与安全注意事项
- 优先使用 Django ORM,避免直接编写原生 SQL(减少注入风险)
- 敏感信息(如数据库密码)不要硬编码,使用环境变量或配置文件
- 表单提交使用 POST 方法,避免敏感数据暴露在 URL 中
- 定期备份数据库,防止数据丢失
总结
Django 的强大之处在于其 "开箱即用" 的特性和完善的生态,从环境搭建到项目部署,全程都有清晰的逻辑和最佳实践指引。本文涵盖了 Django 开发的核心知识点,建议结合官方文档和实际项目练习,逐步掌握 ORM 优化、用户认证、权限控制等高级功能。
无论是快速开发小型应用,还是构建大型企业级系统,Django 都能提供高效、安全、可扩展的解决方案。现在就动手创建你的第一个 Django 项目,开启 Web 开发之旅吧!
📚 学习资源推荐:
- 官方文档:https://docs.djangoproject.com/
- 实战项目:Django 博客、电商网站、管理系统等