Django 是一个开放源代码的 web 应用框架,使用 Python 语言编写,旨在帮助开发人员更快地构建和开发 web 应用。Django 以其“快速开发”和“干净、实用”的设计原则著称,使得开发人员可以专注于编写自己的应用和业务逻辑,而不是重复地处理常见的 web 开发任务。Django 4.x 是其最新版本,带来了许多新的功能和改进,以提高性能和可扩展性。

本文旨在通过一些实际的练习题,帮助自学编程的用户深入理解 Django 框架的核心概念和工作原理。我们将从框架的整体结构、核心组件到高级功能进行逐步探索,帮助你更好地掌握 Django 框架,为日后的 web 开发打下坚实的基础。

Django 框架的基础架构

Django 项目的基本结构(难度:低)

请描述一个新创建的 Django 项目的基本目录结构,并解释每个文件夹和文件的用途。通过理解 Django 项目的结构,掌握如何在项目中组织代码和资源。

新创建的 Django 项目通常包含几个默认的文件夹和文件,这些文件夹和文件为项目提供了基础的功能架构和配置。理解这些文件夹和文件的用途是使用 Django 框架的基础。

myproject/
│
├── myproject/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│
├── manage.py
└── app_name/
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations/
    ├── models.py
    ├── tests.py
    └── views.py

一个 Django 项目的根目录通常包含一个与项目同名的子目录以及一个 manage.py 文件。子目录包含项目的全局配置文件如 settings.py(项目配置)、urls.py(URL 路由配置)、wsgi.py(WSGI 应用入口)。manage.py 是一个命令行工具,用于与 Django 项目进行各种管理操作。每个 Django 应用程序有自己的目录结构,其中包括模型定义文件 models.py,视图定义文件 views.py,以及用于管理应用的 admin.pyapps.py 等文件。

理解 Django 项目的基本目录结构是学习 Django 的第一步,它为你提供了一个组织项目和代码的框架。通过熟悉这些目录和文件,你可以更轻松地管理和扩展 Django 项目。

Django 的模型-视图-模板(MVT)架构(难度:中)

Django 使用模型-视图-模板(MVT)架构来组织代码,请解释 MVT 架构的概念及其工作原理,并实现一个简单的 Django 应用来展示 MVT 架构的基本使用。

MVT 架构是 Django 的核心设计模式,它将业务逻辑、用户界面和数据访问分离开来,使开发和维护更为方便。模型(Model)负责与数据库进行交互,视图(View)处理业务逻辑并返回响应,模板(Template)则负责呈现数据。

# models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

# views.py
from django.shortcuts import render
from .models import Article

def article_list(request):
    articles = Article.objects.all()
    return render(request, 'articles/list.html', {'articles': articles})

# templates/articles/list.html
<!DOCTYPE html>
<html>
<head>
    <title>Articles</title>
</head>
<body>
    <h1>Articles</h1>
    <ul>
        {% for article in articles %}
        <li>{{ article.title }}</li>
        {% endfor %}
    </ul>
</body>
</html>

models.py 文件定义了一个简单的模型 Article,用于表示数据库中的文章数据。views.py 文件定义了一个视图 article_list,从数据库中获取所有文章并将它们传递给模板进行呈现。在 list.html 模板中,使用 Django 模板语言循环输出所有文章的标题。这个简单的应用展示了 MVT 架构的基本工作原理。

通过使用 MVT 架构,Django 将数据访问、业务逻辑和用户界面分离,帮助开发者更清晰地组织代码。这种架构使得 Django 项目更易于维护和扩展。

中间件的使用与自定义(难度:高)

中间件是 Django 处理请求和响应过程中的钩子。在 Django 中实现一个自定义中间件,该中间件能够记录每个请求的处理时间,并将其打印到服务器控制台。

自定义中间件需要继承 Django 的中间件基类,并实现 __init____call__ 方法。在 __call__ 方法中,记录请求开始处理的时间,在视图处理完成后计算处理时间并输出到控制台。

# middleware.py
import time
from django.utils.deprecation import MiddlewareMixin

class RequestTimeLoggingMiddleware(MiddlewareMixin):
    def __init__(self, get_response=None):
        self.get_response = get_response
        super().__init__(get_response)

    def __call__(self, request):
        start_time = time.time()
        response = self.get_response(request)
        duration = time.time() - start_time
        print(f"Request to {request.path} took {duration:.2f} seconds")
        return response

# settings.py (add to MIDDLEWARE)
MIDDLEWARE = [
    **.. other middleware**
    'myproject.middleware.RequestTimeLoggingMiddleware',
]

RequestTimeLoggingMiddleware 类继承自 MiddlewareMixin 并实现了 __call__ 方法。该方法在请求到达时记录当前时间,执行视图函数后计算请求处理的持续时间,并将其输出到控制台。在 settings.py 文件的 MIDDLEWARE 列表中,将自定义的中间件添加到中间件链的末尾。

通过实现自定义中间件,可以扩展 Django 的功能并在请求处理过程中加入自定义逻辑。中间件是 Django 强大和灵活性的一个体现,熟练掌握中间件的使用有助于开发更复杂的 web 应用。

Django 4.0 综合练习题(难度:高)

你是一位自由职业的开发者,受邀为一家本地餐厅开发一个小型的在线订餐系统。该系统需要包含以下功能模块:用户可以查看菜单并进行下单,管理员可以通过后台管理系统对菜单和订单进行管理和更新。请根据以下要求完成这个项目:

  1. 安装 Django 并创建新项目:创建一个名为 restaurant 的 Django 项目,并在其中创建一个名为 ordering 的应用。
  2. 模型设计:设计三个模型,分别是 MenuItem(菜单项),Order(订单) 和 OrderItem(订单项)。MenuItem 应该包含菜品名称、描述、价格和库存数量;Order 应该包含订单日期、顾客姓名和订单状态;OrderItem 应该包含与菜单项和订单的关联及数量信息。
  3. 数据迁移:完成数据迁移,将模型创建为数据库中的表。
  4. 数据 API 接口:为菜单项和订单创建 RESTful API 接口,允许前端应用进行菜单查看和下单操作。
  5. 数据动态管理:在 Django Admin 中实现对菜单和订单的动态管理功能。
  6. 设置路由、视图和模板:配置 Django 路由和视图,使用户可以通过网页查看菜单、添加订单,并查看订单状态。
  7. Django Admin 设置:配置 Django Admin 界面,使其能够对 MenuItemOrderOrderItem 进行管理。

安装 Django 并创建项目和应用。然后设计模型,进行数据迁移,确保所有数据库表都创建完毕。为模型创建 RESTful API 接口以实现数据交互。在 Django Admin 中注册模型以实现数据动态管理功能。设置路由、视图和模板以支持用户通过网页交互的功能。

安装 Django 并创建项目和应用
通过 pip install django 安装 Django,然后使用 django-admin startproject 命令创建一个名为 restaurant 的项目。使用 python manage.py startapp 命令创建一个应用 ordering

# Step 1: 安装 Django 并创建项目和应用
pip install django
django-admin startproject restaurant
cd restaurant
python manage.py startapp ordering

模型设计
ordering/models.py 中定义了三个模型:MenuItem 表示菜单项,包含名称、描述、价格和库存;Order 表示订单,包含订单日期、顾客姓名和状态;OrderItem 表示订单项,包含与菜单项和订单的关联及数量。

# Step 2: 在 ordering/models.py 中定义模型

from django.db import models

class MenuItem(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    price = models.DecimalField(max_digits=5, decimal_places=2)
    stock = models.PositiveIntegerField()

    def __str__(self):
        return self.name

class Order(models.Model):
    order_date = models.DateTimeField(auto_now_add=True)
    customer_name = models.CharField(max_length=100)
    status = models.CharField(max_length=20, choices=[('Pending', 'Pending'), ('Completed', 'Completed')])

    def __str__(self):
        return f'Order {self.id} - {self.customer_name}'

class OrderItem(models.Model):
    menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField()

    def __str__(self):
        return f'{self.quantity} x {self.menu_item.name}'

数据迁移
通过运行 python manage.py makemigrationspython manage.py migrate 命令,将模型转换为数据库中的表。

# Step 3: 数据迁移
python manage.py makemigrations
python manage.py migrate

数据 API 接口
使用 Django REST Framework 创建了 API 视图,MenuItemViewSetOrderViewSet 用于处理菜单项和订单的 API 请求。

# Step 4: 在 ordering/views.py 中创建 API 视图 (使用 Django REST Framework)

from rest_framework import viewsets
from .models import MenuItem, Order
from .serializers import MenuItemSerializer, OrderSerializer

class MenuItemViewSet(viewsets.ModelViewSet):
    queryset = MenuItem.objects.all()
    serializer_class = MenuItemSerializer

class OrderViewSet(viewsets.ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

数据动态管理
ordering/admin.py 中注册模型,以便在 Django Admin 界面中进行管理。

# Step 5: 在 ordering/admin.py 中注册模型
from django.contrib import admin
from .models import MenuItem, Order, OrderItem

admin.site.register(MenuItem)
admin.site.register(Order)
admin.site.register(OrderItem)

设置路由
restaurant/urls.py 中设置了 API 路由和网页视图路由。

# Step 6: 在 restaurant/urls.py 中设置路由

from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from ordering.views import MenuItemViewSet, OrderViewSet

router = DefaultRouter()
router.register(r'menu', MenuItemViewSet)
router.register(r'orders', OrderViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),  # API 路由
    path('', include('ordering.urls')),  # 网页视图路由
]

视图和模板
ordering/views.py 中创建了视图函数来处理菜单列表显示和订单创建。

# Step 7: 在 ordering/views.py 中创建视图函数

from django.shortcuts import render
from .models import MenuItem, Order

def menu_list(request):
    items = MenuItem.objects.all()
    return render(request, 'ordering/menu_list.html', {'items': items})

def order_create(request):
    if request.method == 'POST':
        # 处理表单提交逻辑
        pass
    return render(request, 'ordering/order_form.html')

这个综合练习题涵盖了 Django 项目从安装、模型设计、数据迁移到 API 接口、动态管理、视图和模板配置的所有关键部分。通过完成这个项目,你将深入了解 Django 4.0 的完整开发流程,并掌握如何创建一个功能全面的 Web 应用。

09-22 00:30