文章列表
5 分钟阅读

Django 安装与使用指南


系列:Python Web 框架

第 3 / 11 篇

  1. FastAPI 安装与使用指南
  2. FastAPI 进阶使用指南
  3. Django 安装与使用指南
  4. Django 进阶使用指南
  5. Django 与 FastAPI 对比:如何选择合适的 Python Web 框架
  6. Python Web 框架有哪些,怎么选
  7. Flask 安装与使用指南
  8. Django REST Framework 入门:把 Django 做成 API
  9. FastAPI 项目实战:用户登录与 JWT 鉴权
  10. Python Web 项目部署指南:Gunicorn、Uvicorn、Nginx 和 Docker
  11. Python Web 项目结构怎么设计

Django 是一个 Python 全栈 Web 框架,遵循 MVT(Model-View-Template)架构,内置 ORM、后台管理、用户认证、表单处理等功能。它的设计理念是「开箱即用」——不需要额外集成就能快速搭建完整的 Web 应用。

适用环境

Django 需要 Python 3.10 及以上版本(Django 5.2.x)。本文在 Linux 环境下示范,macOS 和 Windows 同样适用。

安装前确认 Python 和 pip 版本:

Terminal window
python3 --version
pip --version

建议在虚拟环境中操作:

安装 Django

创建项目目录并初始化虚拟环境:

Terminal window
mkdir django-demo && cd django-demo
python3 -m venv .venv
source .venv/bin/activate

激活后终端提示符前会出现 (.venv) 标识。安装 Django:

Terminal window
pip install django

安装完成后确认版本:

Terminal window
python -m django --version

创建项目

使用 django-admin 创建一个新项目:

Terminal window
django-admin startproject mysite .

注意末尾的 . 表示在当前目录创建项目,这样项目文件会直接放在 django-demo/ 下,不会多套一层目录。

创建后的目录结构:

django-demo/
├── manage.py # 命令行工具
├── mysite/
│ ├── __init__.py
│ ├── settings.py # 项目配置
│ ├── urls.py # 根路由
│ ├── wsgi.py # WSGI 入口
│ └── asgi.py # ASGI 入口

启动开发服务器:

Terminal window
python manage.py runserver

访问 http://127.0.0.1:8000,看到 Django 欢迎页就说明项目创建成功。

默认监听 127.0.0.1:8000,如需局域网访问可以指定地址和端口:

Terminal window
python manage.py runserver 0.0.0.0:8080

创建应用

Django 项目由多个「应用」组成,每个应用负责一块独立功能。创建一个名为 blog 的应用:

Terminal window
python manage.py startapp blog

目录结构变为:

django-demo/
├── manage.py
├── mysite/
│ └── ...
├── blog/
│ ├── migrations/ # 数据库迁移文件
│ ├── admin.py # 后台管理配置
│ ├── apps.py # 应用配置
│ ├── models.py # 数据模型
│ └── views.py # 视图逻辑

把应用注册到项目。编辑 mysite/settings.py,在 INSTALLED_APPS 中添加:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # 新增
]

第一个视图

编辑 blog/views.py

from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, Django!")

创建 blog/urls.py 配置应用路由:

from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]

然后在项目根路由 mysite/urls.py 中引入:

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]

访问 http://127.0.0.1:8000,页面显示 Hello, Django!

数据模型与 ORM

blog/models.py 中定义文章模型:

from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200, verbose_name='标题')
body = models.TextField(verbose_name='正文')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.title

生成迁移文件并应用到数据库:

Terminal window
python manage.py makemigrations
python manage.py migrate

Django 默认使用 SQLite,数据库文件为项目根目录下的 db.sqlite3,无需额外配置。

在视图中使用 ORM

修改 blog/views.py

from django.http import HttpResponse
from .models import Post
def index(request):
posts = Post.objects.all()
lines = [f'<li>{p.title}{p.created_at:%Y-%m-%d}</li>' for p in posts]
return HttpResponse(f"<ul>{''.join(lines)}</ul>")

通过 shell 添加测试数据

Terminal window
python manage.py shell

进入交互式环境:

from blog.models import Post
Post.objects.create(title='第一篇文章', body='这是正文内容。')
Post.objects.create(title='第二篇文章', body='又一篇正文。')
Post.objects.all()

刷新页面即可看到文章列表。

使用模板

上面的视图直接把 HTML 写在 Python 代码里,实际项目应当使用模板。在 blog/ 下创建模板目录:

Terminal window
mkdir -p blog/templates/blog

创建 blog/templates/blog/index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>博客</title>
</head>
<body>
<h1>文章列表</h1>
<ul>
{% for post in posts %}
<li>
<h2>{{ post.title }}</h2>
<p>{{ post.body|truncatechars:100 }}</p>
<small>{{ post.created_at|date:"Y-m-d" }}</small>
</li>
{% empty %}
<li>暂无文章。</li>
{% endfor %}
</ul>
</body>
</html>

修改 blog/views.py 使用模板渲染:

from django.shortcuts import render
from .models import Post
def index(request):
posts = Post.objects.all()
return render(request, 'blog/index.html', {'posts': posts})

render 接收三个参数:请求对象、模板路径、上下文数据。模板中 {% for %}{{ }} 是 Django 模板语法的循环和变量输出。

后台管理

Django 自带功能完善的后台管理界面。先创建管理员账号:

Terminal window
python manage.py createsuperuser

按提示输入用户名、邮箱和密码。把 Post 模型注册到后台,编辑 blog/admin.py

from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'created_at', 'updated_at']
search_fields = ['title']

启动服务器后访问 http://127.0.0.1:8000/admin/,用刚才创建的账号登录,即可在后台增删改查文章。

常用命令速查

Terminal window
python manage.py runserver # 启动开发服务器
python manage.py startapp appname # 创建应用
python manage.py makemigrations # 生成迁移文件
python manage.py migrate # 应用迁移
python manage.py createsuperuser # 创建管理员
python manage.py shell # 交互式 Python shell
python manage.py collectstatic # 收集静态文件
python manage.py test # 运行测试
python manage.py showmigrations # 查看迁移状态

常见问题

修改模型后页面报错

修改了 models.py 后需要生成并应用迁移:

Terminal window
python manage.py makemigrations
python manage.py migrate

如果迁移冲突或出错,可以先查看状态:

Terminal window
python manage.py showmigrations

静态文件 404

开发环境下 Django 会自动处理静态文件。如果 404,确认 settings.pyINSTALLED_APPS 包含了 django.contrib.staticfiles

生产环境需要用 collectstatic 收集静态文件并由 Nginx 等服务处理。

模板找不到

Django 默认在每个已注册应用的 templates/ 目录下查找模板。推荐的目录结构是 blog/templates/blog/index.html(加一层应用名的子目录),这样不同应用的模板不会重名冲突。

CSRF 验证失败

POST 表单需要在模板内添加 {% csrf_token %} 标签:

<form method="post">
{% csrf_token %}
<!-- 表单字段 -->
<button type="submit">提交</button>
</form>

如果是在 API 场景(前后端分离),可以给视图加 @csrf_exempt 装饰器,或使用 DRF(Django REST Framework)等方案。

端口已被占用

开发服务器默认使用 8000 端口,如果冲突可以指定其他端口:

Terminal window
python manage.py runserver 8001

pip 安装慢或失败

参考 pip 源的设置和使用 配置国内镜像源。

总结

Django 作为全栈框架,优势在于开箱即用和组件齐全。本文覆盖了安装、项目与应用创建、路由配置、ORM 数据操作、模板渲染和后台管理等核心环节,足够搭建一个功能完整的 Web 应用。更多内容可以参考 Django 官方文档