1. 为什么选择Django作为你的第一个Web框架
十年前我刚接触Web开发时,面对琳琅满目的框架选择也曾犹豫不决。直到遇见Django,这个"为完美主义者设计的框架"彻底改变了我的开发体验。不同于其他需要从零组装各种组件的框架,Django自带全套工具包——就像买手机时厂商已经贴好了膜、装好了常用APP。
Django最显著的特点是"开箱即用"的完整性。它内置了:
- 对象关系映射(ORM)系统
- 自动化后台管理界面
- 用户认证系统
- 缓存机制
- RSS/Atom生成器
- 甚至地理空间数据处理
这种"全家桶"式的设计让新手可以快速搭建功能完整的应用,而不用在第三方库的选择中迷失。我在教学过程中发现,使用Django的学生比其他框架的学习者平均早2周完成第一个可展示项目。
2. 开发环境配置实战
2.1 Python环境搭建要点
Django对Python版本有明确要求(目前支持3.8+),我强烈建议使用pyenv管理多版本Python环境。这是我在Mac上的标准配置流程:
bash复制brew install pyenv
pyenv install 3.10.6
pyenv global 3.10.6
Windows用户可以使用官方安装包,但务必勾选"Add Python to PATH"。安装后验证:
bash复制python --version
pip --version
注意:永远不要使用系统自带的Python(特别是macOS)。我见过无数奇怪的错误都源于此。
2.2 虚拟环境最佳实践
虚拟环境是Python项目的保险箱。推荐使用python内置的venv模块:
bash复制python -m venv myenv
source myenv/bin/activate # Linux/Mac
myenv\Scripts\activate.bat # Windows
激活后,提示符前会出现环境名称。这时安装的包只会存在于当前环境。我习惯在每个项目根目录都创建独立的虚拟环境,并用.gitignore排除它们。
3. Django项目骨架搭建
3.1 项目与应用的区别
新手最容易混淆的概念就是项目(Project)和应用(Apps):
- 项目是完整的网站容器(包含配置)
- 应用是独立的功能模块(如博客、用户系统)
一个项目可以包含多个应用。我建议按功能边界划分应用,比如:
code复制myproject/
blog/
users/
products/
3.2 创建第一个项目
安装最新版Django并创建项目:
bash复制pip install django
django-admin startproject mysite
这会生成如下结构:
code复制mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
运行开发服务器测试:
bash复制python manage.py runserver
访问http://127.0.0.1:8000 你会看到火箭发射页面——恭喜,Django已经运行起来了!
4. 模型设计核心要点
4.1 ORM基础模型
Django的ORM让你用Python类定义数据库表。创建一个博客应用来演示:
bash复制python manage.py startapp blog
编辑blog/models.py:
python复制from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
这个模型会自动转换成数据库表,包含:
- 标题(字符型,最大200)
- 内容(长文本)
- 创建时间(自动设置)
- 更新时间(自动更新)
4.2 数据库迁移实战
Django使用迁移系统同步模型变更:
bash复制python manage.py makemigrations
python manage.py migrate
经验:每次修改模型后都要执行这两条命令。我在团队中见过因为忘记迁移导致的数据库不一致问题,调试起来非常痛苦。
5. 管理后台深度配置
5.1 超级用户创建
Django自带功能强大的admin界面。首先创建管理员:
bash复制python manage.py createsuperuser
按提示输入用户名、邮箱和密码。然后注册模型到admin.py:
python复制from django.contrib import admin
from .models import Post
admin.site.register(Post)
访问/admin即可看到Post模型的CRUD界面。但默认配置很基础,我们可以优化:
5.2 高级admin定制
python复制class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'created_at', 'updated_at')
search_fields = ('title', 'content')
list_filter = ('created_at',)
date_hierarchy = 'created_at'
admin.site.register(Post, PostAdmin)
现在admin界面将显示:
- 表格视图带分页
- 标题和时间的搜索框
- 按创建时间过滤
- 日期层级导航
6. 视图与URL配置实战
6.1 第一个视图函数
在blog/views.py中:
python复制from django.http import HttpResponse
from .models import Post
def post_list(request):
posts = Post.objects.all().order_by('-created_at')
output = '\n'.join([p.title for p in posts])
return HttpResponse(output)
6.2 URL路由配置
在blog目录下新建urls.py:
python复制from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
]
然后在项目urls.py中包含它:
python复制from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
现在访问/blog/就能看到文章列表了。虽然现在只是纯文本输出,但已经完成了MVC中的VC部分。
7. 模板系统深度解析
7.1 基础模板配置
在blog目录下创建templates/blog目录,新建post_list.html:
html复制<!DOCTYPE html>
<html>
<head>
<title>My Blog</title>
</head>
<body>
<h1>Posts</h1>
<ul>
{% for post in posts %}
<li>{{ post.title }} - {{ post.created_at }}</li>
{% endfor %}
</ul>
</body>
</html>
修改视图使用模板:
python复制from django.shortcuts import render
def post_list(request):
posts = Post.objects.all().order_by('-created_at')
return render(request, 'blog/post_list.html', {'posts': posts})
7.2 模板继承技巧
创建base.html:
html复制<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
<div id="content">
{% block content %}
{% endblock %}
</div>
</body>
</html>
然后让post_list.html继承它:
html复制{% extends "blog/base.html" %}
{% block title %}Post List{% endblock %}
{% block content %}
<h1>Posts</h1>
<ul>
{% for post in posts %}
<li>{{ post.title }} - {{ post.created_at }}</li>
{% endfor %}
</ul>
{% endblock %}
这种模式可以极大减少重复代码。我的项目中通常有3层模板继承:
- base.html - 全局HTML骨架
- section_base.html - 版块特定结构
- page.html - 具体页面
8. 常见问题排坑指南
8.1 静态文件404错误
Django开发服务器默认不处理静态文件。需要:
- 确保settings.py有:
python复制STATIC_URL = '/static/'
- 在模板顶部添加:
html复制{% load static %}
- 引用静态文件时使用:
html复制<img src="{% static 'images/logo.png' %}">
8.2 数据库表不存在
如果遇到"table does not exist"错误:
- 检查是否执行了makemigrations和migrate
- 确认应用是否在INSTALLED_APPS中注册
- 尝试python manage.py migrate --run-syncdb
8.3 模板找不到
模板路径问题很常见,确保:
- 在settings.py的TEMPLATES中正确配置了APP_DIRS=True
- 模板放在正确的相对路径(appname/templates/appname/)
- 重启开发服务器(它不会自动检测新增模板)
9. 项目结构优化建议
经过多年实践,我总结出这样的项目结构:
code复制project/
config/
settings/
__init__.py
base.py
development.py
production.py
apps/
blog/
users/
static/
templates/
manage.py
关键改进:
- 拆分settings为不同环境配置
- 所有应用集中在apps目录
- 全局静态文件和模板统一管理
要实现这种结构,需要:
- 移动原有应用到apps目录
- 在settings中调整BASE_DIR:
python复制BASE_DIR = Path(__file__).resolve().parent.parent
- 修改所有相关导入语句
10. 下一步学习路径
掌握这些基础后,我建议按这个顺序深入:
- 用户认证系统(django.contrib.auth)
- 表单处理(从ModelForm开始)
- 类视图(替代函数视图)
- REST框架(Django REST framework)
- 异步支持(Django 3.1+)
我在实际项目中发现,很多开发者过早接触高级主题,反而忽略了Django的核心设计哲学。建议至少完成3个完整项目后再学习高级特性。