Django 教程(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Web 开发领域,Django 作为 Python 语言中广受欢迎的全栈框架,凭借其“快速开发”和“简洁设计”的核心理念,吸引了大量开发者。无论是初创公司的 MVP(最小可行产品)构建,还是企业级复杂系统的开发,Django 都能提供高效且可靠的解决方案。本文将从零开始,通过一个电商系统的实际案例,系统讲解 Django 的核心概念、开发流程及最佳实践,帮助编程初学者和中级开发者快速掌握这一框架。
环境搭建与项目初始化
开发环境配置
Django 的开发需要 Python 环境支持。首先,确保已安装 Python 3.8+(推荐使用 Python 3.11)。接下来,通过虚拟环境隔离项目依赖:
python -m venv my_django_env
my_django_env\Scripts\activate
source my_django_env/bin/activate
安装 Django:
pip install django==4.2.3
创建第一个 Django 项目
运行以下命令创建名为 eCommerce
的项目:
django-admin startproject eCommerce
项目目录结构如下:
eCommerce/
├── eCommerce/
│ ├── __init__.py
│ ├── settings.py # 项目配置文件
│ ├── urls.py # 全局 URL 配置
│ └── wsgi.py # Web 服务器接口
└── manage.py # 项目管理命令入口
模型设计:构建数据蓝图
Django 的 MVC 模式与 ORM
Django 采用 MVC(模型-视图-控制器)架构,但更常被称为 MTV(模型-模板-视图)。其中:
- 模型(Model):定义数据结构,对应数据库表。
- 视图(View):处理业务逻辑,返回 HTTP 响应。
- 模板(Template):负责页面渲染。
Django 的 ORM(对象关系映射)允许开发者通过 Python 代码操作数据库,无需直接编写 SQL 语句。例如,定义一个商品模型:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
关键字段说明
字段类型 | 描述 | 常用参数 |
---|---|---|
CharField | 短文本(如标题) | max_length |
DecimalField | 精确小数(如价格) | max_digits, decimal_places |
TextField | 长文本(如描述) | |
DateTimeField | 时间戳 | auto_now_add |
迁移数据库
执行以下命令创建数据库表:
python manage.py makemigrations products
python manage.py migrate
URL 路由:构建网站导航
URL 配置逻辑
Django 的 URL 配置通过 urls.py
文件实现,采用分层设计。以电商系统为例,商品列表和详情页的路由配置如下:
from django.urls import path
from . import views
urlpatterns = [
path('products/', views.product_list, name='product_list'),
path('products/<int:pk>/', views.product_detail, name='product_detail'),
]
全局 URL 需要在项目根目录的 urls.py
中包含该 app 的路由:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('products.urls')),
]
路由设计原则
- 简洁性:避免过长的路径,如
/products/list
可简化为/products/
。 - RESTful 风格:使用
/products/123/
而非/get_product_by_id/123/
。 - 命名路由:通过
name
参数方便在视图和模板中反向引用。
视图与模板:动态内容渲染
视图函数与类视图
视图负责处理请求并返回响应。例如,商品列表的视图函数:
from django.shortcuts import render
from .models import Product
def product_list(request):
products = Product.objects.all()
return render(request, 'products/product_list.html', {'products': products})
类视图的优势
对于复杂逻辑,可使用基于类的视图(CBV):
from django.views.generic import ListView
class ProductListView(ListView):
model = Product
template_name = 'products/product_list.html' # 指定模板文件
模板语言:动态渲染页面
在模板文件 product_list.html
中,通过 Django 模板语言遍历商品数据:
<!-- products/product_list.html -->
{% extends 'base.html' %}
{% block content %}
<h1>商品列表</h1>
<ul>
{% for product in products %}
<li>
<h2>{{ product.name }}</h2>
<p>价格:{{ product.price }}</p>
<a href="{% url 'product_detail' product.pk %}">查看详情</a>
</li>
{% empty %}
<p>暂无商品</p>
{% endfor %}
</ul>
{% endblock %}
模板继承与静态资源
通过 {% extends %}
实现模板继承,减少重复代码。静态文件(CSS/JS)需配置 STATIC_URL
并使用 {% static %}
标签引用。
表单与模型绑定:用户交互
Django 表单类
通过 ModelForm
可快速生成表单,例如商品创建表单:
from django import forms
from .models import Product
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price', 'description']
在视图中处理表单提交:
def create_product(request):
if request.method == 'POST':
form = ProductForm(request.POST)
if form.is_valid():
form.save()
return redirect('product_list')
else:
form = ProductForm()
return render(request, 'products/create_product.html', {'form': form})
表单验证与错误处理
Django 自动验证字段约束(如 max_length
),并在模板中显示错误信息:
<!-- create_product.html -->
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">提交</button>
</form>
部署与扩展:从开发到生产
开发环境与生产环境分离
在 settings.py
中通过环境变量区分配置:
import os
DEBUG = os.getenv('DEBUG', 'False') == 'True'
SECRET_KEY = os.getenv('SECRET_KEY')
部署方案推荐
- 数据库:PostgreSQL(推荐)或 MySQL
- Web 服务器:Nginx + Gunicorn
- 静态文件:使用 AWS S3 或 CDN 加速
示例部署命令
pip install gunicorn
gunicorn --bind 0.0.0.0:8000 eCommerce.wsgi:application
第三方扩展推荐
- Django REST framework:构建 API
- Django Debug Toolbar:调试工具
- Celery:异步任务处理
结论与进阶建议
通过本文的案例,读者已掌握 Django 的核心流程:从模型设计到路由配置、视图逻辑及模板渲染。对于中级开发者,建议深入学习以下内容:
- 中间件:自定义请求处理流程
- 权限系统:基于 Django 的用户认证扩展
- 国际化:多语言支持
Django 的强大之处在于其“约定优于配置”的设计哲学,开发者只需专注业务逻辑即可快速构建高质量应用。建议通过实践项目巩固知识,并参考官方文档探索更多高级功能。记住,最好的学习方式是动手编写代码——现在,是时候创建自己的 Django 项目了!