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 的核心流程:从模型设计到路由配置、视图逻辑及模板渲染。对于中级开发者,建议深入学习以下内容:

  1. 中间件:自定义请求处理流程
  2. 权限系统:基于 Django 的用户认证扩展
  3. 国际化:多语言支持

Django 的强大之处在于其“约定优于配置”的设计哲学,开发者只需专注业务逻辑即可快速构建高质量应用。建议通过实践项目巩固知识,并参考官方文档探索更多高级功能。记住,最好的学习方式是动手编写代码——现在,是时候创建自己的 Django 项目了!

最新发布