Django 是一个开放源代码的 web 应用框架,使用 Python 语言编写,旨在帮助开发人员更快地构建和开发 web 应用。Django 以其"快速开发"和"干净、实用"的设计原则著称,使得开发人员可以专注于编写自己的应用和业务逻辑,而不是重复地处理常见的 web 开发任务。Django 4.x 是其最新版本,带来了许多新的功能和改进,以提高性能和可扩展性。
本文旨在通过一些实际的练习题,帮助自学编程的用户深入理解 Django 框架的核心概念和工作原理。我们将从框架的整体结构、核心组件到高级功能进行逐步探索,帮助你更好地掌握 Django 框架,为日后的 web 开发打下坚实的基础。
文章目录
- [Django 框架的基础架构](#Django 框架的基础架构)
-
- [Django 项目的基本结构(难度:低)](#Django 项目的基本结构(难度:低))
- [Django 的模型-视图-模板(MVT)架构(难度:中)](#Django 的模型-视图-模板(MVT)架构(难度:中))
- 中间件的使用与自定义(难度:高)
- [Django 4.0 综合练习题(难度:高)](#Django 4.0 综合练习题(难度:高))
Django 框架的基础架构
Django 项目的基本结构(难度:低)
请描述一个新创建的 Django 项目的基本目录结构,并解释每个文件夹和文件的用途。通过理解 Django 项目的结构,掌握如何在项目中组织代码和资源。
新创建的 Django 项目通常包含几个默认的文件夹和文件,这些文件夹和文件为项目提供了基础的功能架构和配置。理解这些文件夹和文件的用途是使用 Django 框架的基础。
bash
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.py
和 apps.py
等文件。
理解 Django 项目的基本目录结构是学习 Django 的第一步,它为你提供了一个组织项目和代码的框架。通过熟悉这些目录和文件,你可以更轻松地管理和扩展 Django 项目。
Django 的模型-视图-模板(MVT)架构(难度:中)
Django 使用模型-视图-模板(MVT)架构来组织代码,请解释 MVT 架构的概念及其工作原理,并实现一个简单的 Django 应用来展示 MVT 架构的基本使用。
MVT 架构是 Django 的核心设计模式,它将业务逻辑、用户界面和数据访问分离开来,使开发和维护更为方便。模型(Model)负责与数据库进行交互,视图(View)处理业务逻辑并返回响应,模板(Template)则负责呈现数据。
python
# 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__
方法中,记录请求开始处理的时间,在视图处理完成后计算处理时间并输出到控制台。
python
# 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 综合练习题(难度:高)
你是一位自由职业的开发者,受邀为一家本地餐厅开发一个小型的在线订餐系统。该系统需要包含以下功能模块:用户可以查看菜单并进行下单,管理员可以通过后台管理系统对菜单和订单进行管理和更新。请根据以下要求完成这个项目:
- 安装 Django 并创建新项目 :创建一个名为
restaurant
的 Django 项目,并在其中创建一个名为ordering
的应用。 - 模型设计 :设计三个模型,分别是
MenuItem
(菜单项),Order
(订单) 和OrderItem
(订单项)。MenuItem
应该包含菜品名称、描述、价格和库存数量;Order
应该包含订单日期、顾客姓名和订单状态;OrderItem
应该包含与菜单项和订单的关联及数量信息。 - 数据迁移:完成数据迁移,将模型创建为数据库中的表。
- 数据 API 接口:为菜单项和订单创建 RESTful API 接口,允许前端应用进行菜单查看和下单操作。
- 数据动态管理:在 Django Admin 中实现对菜单和订单的动态管理功能。
- 设置路由、视图和模板:配置 Django 路由和视图,使用户可以通过网页查看菜单、添加订单,并查看订单状态。
- Django Admin 设置 :配置 Django Admin 界面,使其能够对
MenuItem
、Order
和OrderItem
进行管理。
安装 Django 并创建项目和应用。然后设计模型,进行数据迁移,确保所有数据库表都创建完毕。为模型创建 RESTful API 接口以实现数据交互。在 Django Admin 中注册模型以实现数据动态管理功能。设置路由、视图和模板以支持用户通过网页交互的功能。
安装 Django 并创建项目和应用
通过 pip install django
安装 Django,然后使用 django-admin startproject
命令创建一个名为 restaurant
的项目。使用 python manage.py startapp
命令创建一个应用 ordering
。
bash
# Step 1: 安装 Django 并创建项目和应用
pip install django
django-admin startproject restaurant
cd restaurant
python manage.py startapp ordering
模型设计
在 ordering/models.py
中定义了三个模型:MenuItem
表示菜单项,包含名称、描述、价格和库存;Order
表示订单,包含订单日期、顾客姓名和状态;OrderItem
表示订单项,包含与菜单项和订单的关联及数量。
python
# 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 makemigrations
和 python manage.py migrate
命令,将模型转换为数据库中的表。
bash
# Step 3: 数据迁移
python manage.py makemigrations
python manage.py migrate
数据 API 接口
使用 Django REST Framework 创建了 API 视图,MenuItemViewSet
和 OrderViewSet
用于处理菜单项和订单的 API 请求。
python
# 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 界面中进行管理。
python
# 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 路由和网页视图路由。
python
# 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
中创建了视图函数来处理菜单列表显示和订单创建。
python
# 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 应用。