当前位置: 首页 > java >正文

《Python星球日记》第31天:Django 框架入门

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
专栏:《Python星球日记》,限时特价订阅中ing

目录

    • 一、Django 简介
      • 1. Django 的特点与应用场景
      • 2. 创建 Django 项目与应用
    • 二、模型与数据库
      • 1. 定义模型:`models.Model`
      • 2. 迁移命令:`makemigrations`、`migrate`
    • 三、视图与模板
      • 1. 视图函数:`HttpResponse`、`render()`
      • 2. URL配置
      • 3. 模板渲染:Django 模板语言
    • 四、练习:创建一个简单的任务管理系统
      • 1. 创建项目和应用
      • 2. 配置设置
      • 3. 定义模型
      • 4. 数据库迁移
      • 5. 创建管理界面
      • 6. 创建视图
      • 7. 配置URL
      • 8. 创建模板
      • 9. 运行服务器
    • 五、总结与进阶方向

👋 专栏介绍: Python星球日记专栏介绍(持续更新ing)
上一篇: 《Python星球日记》第30天:Flask数据库集成

欢迎来到Python星球日记第31天🪐!

今天我们将探索Python世界中最流行的Web框架之一——Django。经过前面对Flask的学习,今天我们将接触一个更加全面和强大的框架,它能够帮助我们构建复杂的Web应用。

一、Django 简介

Django是一个高级的Python Web框架,它遵循"DRY"(Don’t Repeat Yourself)原则MVT(Model-View-Template)架构模式,旨在让开发者能够快速构建安全、可维护的Web应用。

在这里插入图片描述
图片:Django MVT架构图

1. Django 的特点与应用场景

Django的主要特点

  • 开箱即用:Django提供了完整的解决方案,包含ORM、模板引擎、表单处理、认证系统等组件
  • 安全性高:内置防御常见Web攻击,如SQL注入、跨站脚本(XSS)、CSRF等
  • 可扩展性:提供插件系统,可以方便地扩展功能
  • 大型社区:庞大的生态系统和活跃的社区支持
  • Admin后台:自动生成的管理界面,无需额外编码

在这里插入图片描述
图片:Django核心组件

适用场景

  • 内容管理系统(CMS)
  • 社交网络平台
  • 电子商务网站
  • 数据分析与科学计算平台
  • 金融科技应用

2. 创建 Django 项目与应用

在开始使用Django之前,我们需要先安装它:

pip install django

创建Django项目:

# 创建名为myproject的Django项目
django-admin startproject myproject# 进入项目目录
cd myproject

这将创建以下目录结构:

myproject/
├── manage.py            # 项目管理脚本
└── myproject/           # 项目包├── __init__.py      # 空文件,使目录成为包├── settings.py      # 项目设置├── urls.py          # URL声明├── asgi.py          # ASGI兼容的Web服务器入口└── wsgi.py          # WSGI兼容的Web服务器入口

创建Django应用:

在Django中,一个项目可以包含多个应用(app),每个应用负责不同的功能:

# 创建名为tasks的应用
python manage.py startapp tasks

这将创建一个新的应用目录:

tasks/
├── __init__.py          # 空文件,使目录成为包
├── admin.py             # 管理界面配置
├── apps.py              # 应用配置
├── migrations/          # 数据库迁移文件
│   └── __init__.py
├── models.py            # 数据模型定义
├── tests.py             # 测试代码
└── views.py             # 视图函数

创建应用后,需要在settings.pyINSTALLED_APPS列表中注册该应用:

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth',# ...其他默认应用'tasks',  # 添加我们的应用
]

二、模型与数据库

Django的ORM(对象关系映射)系统允许我们通过Python类来定义数据库模型,无需直接编写SQL语句。

在这里插入图片描述
图片:Django模型与数据库关系

1. 定义模型:models.Model

tasks/models.py文件中,我们可以定义数据模型:

from django.db import modelsclass Task(models.Model):# 定义字段title = models.CharField(max_length=200)description = models.TextField(blank=True)created_date = models.DateTimeField(auto_now_add=True)due_date = models.DateTimeField(null=True, blank=True)completed = models.BooleanField(default=False)# 定义字符串表示方法def __str__(self):return self.title# 定义元数据class Meta:ordering = ['-created_date']  # 按创建日期降序排列

常用的字段类型:

  • CharField: 字符串字段,需要指定max_length
  • TextField: 长文本字段
  • IntegerField: 整数字段
  • FloatField: 浮点数字段
  • BooleanField: 布尔字段
  • DateTimeField: 日期时间字段
  • ForeignKey: 外键关系
  • ManyToManyField: 多对多关系

2. 迁移命令:makemigrationsmigrate

定义好模型后,需要将这些模型转换为数据库表结构:

# 创建迁移文件
python manage.py makemigrations# 应用迁移到数据库
python manage.py migrate

迁移过程

  1. makemigrations 命令根据模型变化创建迁移文件
  2. 迁移文件(如migrations/0001_initial.py)包含数据库更改的指令
  3. migrate 命令将这些变更应用到数据库中

在这里插入图片描述
图片:Django数据库迁移流程

检查迁移SQL

如果想查看迁移将执行的SQL语句,可以使用:

python manage.py sqlmigrate tasks 0001

这会显示Django将执行的SQL语句,而不实际执行它们。

三、视图与模板

在Django中:

  • 视图(Views)处理Web请求并返回Web响应
  • 模板(Templates)则定义如何展示数据。

在这里插入图片描述
图片:Django请求处理流程图

1. 视图函数:HttpResponserender()

tasks/views.py文件中,我们可以定义视图函数:

from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import Task# 简单HttpResponse示例
def index(request):return HttpResponse("欢迎来到任务管理系统!")# 使用render函数渲染模板
def task_list(request):tasks = Task.objects.all()  # 获取所有任务return render(request, 'tasks/task_list.html', {'tasks': tasks})# 创建新任务
def create_task(request):if request.method == 'POST':title = request.POST.get('title')description = request.POST.get('description')Task.objects.create(title=title, description=description)return redirect('task_list')return render(request, 'tasks/create_task.html')

2. URL配置

创建好视图后,需要在URL配置中将URL映射到视图函数。首先,在应用目录中创建urls.py文件:

tasks/urls.py:

from django.urls import path
from . import viewsurlpatterns = [path('', views.index, name='index'),path('tasks/', views.task_list, name='task_list'),path('tasks/create/', views.create_task, name='create_task'),
]

然后,在项目的主urls.py文件中包含这个应用的URL配置:

myproject/urls.py:

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

3. 模板渲染:Django 模板语言

Django使用自己的模板语言来渲染HTML页面。首先,在应用目录中创建模板目录结构:

tasks/
├── templates/
│   └── tasks/
│       ├── base.html
│       ├── task_list.html
│       └── create_task.html

base.html(基础模板):

<!DOCTYPE html>
<html>
<head><title>{% block title %}任务管理系统{% endblock %}</title><style>body { font-family: Arial, sans-serif; margin: 0; padding: 20px; }.container { max-width: 800px; margin: 0 auto; }.task { border: 1px solid #ddd; padding: 10px; margin-bottom: 10px; }.completed { background-color: #f8f8f8; }</style>
</head>
<body><div class="container"><h1>任务管理系统</h1><nav><a href="{% url 'index' %}">首页</a> |<a href="{% url 'task_list' %}">任务列表</a> |<a href="{% url 'create_task' %}">创建任务</a></nav><hr>{% block content %}{% endblock %}</div>
</body>
</html>

task_list.html(任务列表):

{% extends 'tasks/base.html' %}{% block title %}任务列表{% endblock %}{% block content %}<h2>任务列表</h2>{% if tasks %}{% for task in tasks %}<div class="task {% if task.completed %}completed{% endif %}"><h3>{{ task.title }}</h3><p>{{ task.description }}</p><p>创建时间: {{ task.created_date }}</p>{% if task.completed %}<p>状态: 已完成</p>{% else %}<p>状态: 未完成</p>{% endif %}</div>{% endfor %}{% else %}<p>没有任务。</p>{% endif %}<a href="{% url 'create_task' %}">创建新任务</a>
{% endblock %}

create_task.html(创建任务):

{% extends 'tasks/base.html' %}{% block title %}创建任务{% endblock %}{% block content %}<h2>创建新任务</h2><form method="post">{% csrf_token %}<div><label for="title">标题:</label><input type="text" id="title" name="title" required></div><div><label for="description">描述:</label><textarea id="description" name="description" rows="4"></textarea></div><button type="submit">保存</button></form>
{% endblock %}

在这里插入图片描述
图片:Django模板继承关系

Django模板语言的主要特性:

  • 变量:使用{{ variable }}显示变量值
  • 标签:使用{% tag %}执行操作,如循环、条件判断等
  • 过滤器:使用{{ variable|filter }}修改变量值的显示方式
  • 注释:使用{# comment #}添加注释
  • 模板继承:使用{% extends 'base.html' %}{% block name %}{% endblock %}实现模板继承
    在这里插入图片描述
    图片:Django模板语言与继承结构

四、练习:创建一个简单的任务管理系统

让我们整合前面所学的知识,创建一个简单的任务管理系统。

项目结构如下:

taskmanager/                  # 项目根目录
├── manage.py                 # Django项目管理脚本
├── taskmanager/             # 项目配置包
│   ├── __init__.py          # 空文件,使目录成为Python包
│   ├── settings.py          # 项目设置
│   ├── urls.py              # 项目URL配置
│   ├── asgi.py              # ASGI应用配置(异步服务器)
│   └── wsgi.py              # WSGI应用配置(传统服务器)
└── tasks/                   # 任务应用├── __init__.py          # 空文件,使目录成为Python包├── admin.py             # 管理界面配置├── apps.py              # 应用配置├── migrations/          # 数据库迁移文件│   ├── __init__.py│   └── 0001_initial.py  # 初始迁移文件(运行迁移后生成)├── models.py            # 数据模型定义├── tests.py             # 测试代码├── urls.py              # 应用URL配置(需要创建)├── views.py             # 视图函数└── templates/           # 模板目录(需要创建)└── tasks/           # 应用模板目录├── base.html            # 基础模板├── task_list.html       # 任务列表模板├── task_detail.html     # 任务详情模板└── task_form.html       # 任务表单模板

关键文件说明

  • manage.py:Django的命令行工具,用于执行各种管理任务
  • taskmanager/settings.py:包含项目的所有配置参数
  • taskmanager/urls.py:定义项目级URL路由
  • tasks/models.py:定义数据模型(Task模型)
  • tasks/views.py:包含处理Web请求的视图函数
  • tasks/urls.py:定义应用级URL路由
  • tasks/admin.py:注册模型到管理界面
  • tasks/templates/:存放HTML模板文件

1. 创建项目和应用

# 创建项目
django-admin startproject taskmanager
cd taskmanager# 创建应用
python manage.py startapp tasks

2. 配置设置

taskmanager/settings.py中注册应用:

INSTALLED_APPS = ['django.contrib.admin',# ...其他默认应用'tasks',
]

3. 定义模型

tasks/models.py中定义任务模型:

from django.db import modelsclass Task(models.Model):PRIORITY_CHOICES = [('low', '低'),('medium', '中'),('high', '高'),]title = models.CharField(max_length=200, verbose_name='标题')description = models.TextField(blank=True, verbose_name='描述')created_date = models.DateTimeField(auto_now_add=True, verbose_name='创建日期')due_date = models.DateTimeField(null=True, blank=True, verbose_name='截止日期')priority = models.CharField(max_length=10, choices=PRIORITY_CHOICES, default='medium', verbose_name='优先级')completed = models.BooleanField(default=False, verbose_name='已完成')def __str__(self):return self.titleclass Meta:ordering = ['-created_date']verbose_name = '任务'verbose_name_plural = '任务列表'

4. 数据库迁移

python manage.py makemigrations
python manage.py migrate

5. 创建管理界面

tasks/admin.py中注册模型:

from django.contrib import admin
from .models import Task@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):list_display = ('title', 'priority', 'created_date', 'due_date', 'completed')list_filter = ('priority', 'completed')search_fields = ('title', 'description')

6. 创建视图

tasks/views.py中定义视图函数:

from django.shortcuts import render, redirect, get_object_or_404
from .models import Task
from django.utils import timezonedef task_list(request):tasks = Task.objects.all()return render(request, 'tasks/task_list.html', {'tasks': tasks})def task_detail(request, pk):task = get_object_or_404(Task, pk=pk)return render(request, 'tasks/task_detail.html', {'task': task})def task_create(request):if request.method == 'POST':title = request.POST.get('title')description = request.POST.get('description')priority = request.POST.get('priority')due_date_str = request.POST.get('due_date')task = Task(title=title,description=description,priority=priority)if due_date_str:task.due_date = due_date_strtask.save()return redirect('task_list')return render(request, 'tasks/task_form.html')def task_complete(request, pk):task = get_object_or_404(Task, pk=pk)task.completed = Truetask.save()return redirect('task_list')

7. 配置URL

tasks/urls.py中配置URL:

from django.urls import path
from . import viewsurlpatterns = [path('', views.task_list, name='task_list'),path('task/<int:pk>/', views.task_detail, name='task_detail'),path('task/new/', views.task_create, name='task_create'),path('task/<int:pk>/complete/', views.task_complete, name='task_complete'),
]

taskmanager/urls.py中包含应用URL:

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

8. 创建模板

创建基础模板tasks/templates/tasks/base.html

<!DOCTYPE html>
<html>
<head><title>{% block title %}任务管理系统{% endblock %}</title><meta name="viewport" content="width=device-width, initial-scale=1"><style>body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; margin: 0; padding: 0; background-color: #f8f9fa; }.container { max-width: 1000px; margin: 0 auto; padding: 20px; }.header { background-color: #343a40; color: white; padding: 20px 0; margin-bottom: 20px; }.header h1 { margin: 0; padding: 0 20px; }.nav { background-color: #212529; padding: 10px 20px; }.nav a { color: white; text-decoration: none; margin-right: 15px; }.nav a:hover { text-decoration: underline; }.task-card { background-color: white; border-radius: 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); padding: 20px; margin-bottom: 20px; }.task-card.completed { background-color: #e9ecef; }.priority-high { border-left: 5px solid #dc3545; }.priority-medium { border-left: 5px solid #ffc107; }.priority-low { border-left: 5px solid #28a745; }.btn { display: inline-block; padding: 8px 16px; background-color: #007bff; color: white; text-decoration: none; border-radius: 4px; border: none; cursor: pointer; }.btn:hover { background-color: #0069d9; }.btn-success { background-color: #28a745; }.btn-success:hover { background-color: #218838; }.form-group { margin-bottom: 15px; }.form-group label { display: block; margin-bottom: 5px; }.form-control { width: 100%; padding: 8px; border: 1px solid #ced4da; border-radius: 4px; }</style>
</head>
<body><div class="header"><h1>任务管理系统</h1><div class="nav"><a href="{% url 'task_list' %}">任务列表</a><a href="{% url 'task_create' %}">创建任务</a><a href="/admin/">管理后台</a></div></div><div class="container">{% block content %}{% endblock %}</div>
</body>
</html>

任务列表模板tasks/templates/tasks/task_list.html

{% extends 'tasks/base.html' %}{% block title %}任务列表{% endblock %}{% block content %}<h2>我的任务</h2>{% if tasks %}{% for task in tasks %}<div class="task-card {% if task.completed %}completed{% endif %} priority-{{ task.priority }}"><h3>{{ task.title }}</h3><p>{{ task.description|truncatewords:30 }}</p><p><strong>优先级:</strong> {% if task.priority == 'high' %}高{% elif task.priority == 'medium' %}中{% else %}低{% endif %}</p><p><strong>创建时间:</strong> {{ task.created_date|date:"Y-m-d H:i" }}</p>{% if task.due_date %}<p><strong>截止时间:</strong> {{ task.due_date|date:"Y-m-d H:i" }}</p>{% endif %}{% if task.completed %}<p><span class="btn btn-success" style="cursor: default;">已完成</span></p>{% else %}<a href="{% url 'task_complete' task.id %}" class="btn btn-success">标记为已完成</a>{% endif %}<a href="{% url 'task_detail' task.id %}" class="btn">查看详情</a></div>{% endfor %}{% else %}<p>暂无任务。创建一个新任务吧!</p>{% endif %}<a href="{% url 'task_create' %}" class="btn">创建新任务</a>
{% endblock %}

任务详情模板tasks/templates/tasks/task_detail.html

{% extends 'tasks/base.html' %}{% block title %}{{ task.title }}{% endblock %}{% block content %}<div class="task-card {% if task.completed %}completed{% endif %} priority-{{ task.priority }}"><h2>{{ task.title }}</h2><p>{{ task.description }}</p><p><strong>优先级:</strong> {% if task.priority == 'high' %}高{% elif task.priority == 'medium' %}中{% else %}低{% endif %}</p><p><strong>创建时间:</strong> {{ task.created_date|date:"Y-m-d H:i" }}</p>{% if task.due_date %}<p><strong>截止时间:</strong> {{ task.due_date|date:"Y-m-d H:i" }}</p>{% endif %}<p><strong>状态:</strong> {% if task.completed %}已完成{% else %}未完成{% endif %}</p>{% if not task.completed %}<a href="{% url 'task_complete' task.id %}" class="btn btn-success">标记为已完成</a>{% endif %}<a href="{% url 'task_list' %}" class="btn">返回列表</a></div>
{% endblock %}

任务创建表单模板tasks/templates/tasks/task_form.html

{% extends 'tasks/base.html' %}{% block title %}创建任务{% endblock %}{% block content %}<h2>创建新任务</h2><form method="post">{% csrf_token %}<div class="form-group"><label for="title">标题:</label><input type="text" id="title" name="title" class="form-control" required></div><div class="form-group"><label for="description">描述:</label><textarea id="description" name="description" class="form-control" rows="4"></textarea></div><div class="form-group"><label for="priority">优先级:</label><select id="priority" name="priority" class="form-control"><option value="low"></option><option value="medium" selected></option><option value="high"></option></select></div><div class="form-group"><label for="due_date">截止日期 (可选):</label><input type="datetime-local" id="due_date" name="due_date" class="form-control"></div><button type="submit" class="btn">保存任务</button><a href="{% url 'task_list' %}" class="btn" style="background-color: #6c757d;">取消</a></form>
{% endblock %}

9. 运行服务器

python manage.py createsuperuser  # 创建管理员用户
python manage.py runserver

现在,你可以访问以下URL:

  • http://127.0.0.1:8000/ - 任务列表
  • http://127.0.0.1:8000/task/new/ - 创建新任务
  • http://127.0.0.1:8000/admin/ - 管理后台

在这里插入图片描述
图片:任务管理系统-任务列表页面

在这里插入图片描述
图片:任务管理系统-任务详情页面

在这里插入图片描述
图片:任务管理系统-创建任务页面

在这里插入图片描述
图片:任务管理系统- Django管理后台

五、总结与进阶方向

今天,我们学习了Django框架的基础知识,包括:

  1. Django的MVT架构及特点
  2. 如何创建Django项目和应用
  3. 定义数据模型并进行数据库迁移
  4. 使用视图函数处理Web请求
  5. 使用Django模板语言渲染HTML页面
  6. 实践创建了一个简单的任务管理系统

Django功能强大,我们今天只是触及了表面。未来可以探索的进阶方向包括:

  • Django表单:使用forms.py创建和验证表单
  • 基于类的视图:使用更面向对象的方式编写视图
  • 用户认证:实现用户注册、登录和权限管理
  • RESTful API:使用Django REST Framework构建API
  • 测试:编写单元测试和集成测试
  • 部署:将Django应用部署到生产环境

希望今天的内容对你理解Django框架有所帮助。明天我们将继续探索Django的更多高级特性,敬请期待!

参考资源

  • Django官方文档:https://docs.djangoproject.com/
  • Django Girls教程:https://tutorial.djangogirls.org/
  • MDN Django教程:https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Django

欢迎在评论区分享你的Django学习经验和问题!

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果你对今天的内容有任何问题,或者想分享你的学习心得,欢迎在评论区留言讨论!

http://www.xdnf.cn/news/3941.html

相关文章:

  • opencv+opencv_contrib+cuda和VS2022编译
  • 202531 | RocketMQ 消息过滤 + 消息重试机制 + 死信消息 + 重复消费问题
  • zotero pdf中英翻译插件使用
  • epub格式转txt格式工具,txt批量转PDF
  • 设计模式(结构型)-组合模式
  • 【Java ee初阶】多线程(6)
  • item_get_app_pro - 获得淘宝app商品详情原数据操作流程
  • 使用 vllm 部署 Llama3-8b-Instruct
  • 【C++】grpc(一):安装
  • 【Python】Python好玩的第三方库之二维码生成,操作xlsx文件,以及音频控制器
  • 从零开始学Flink:开启实时计算的魔法之旅
  • CSS知识总结
  • Socket 编程 TCP
  • OpenGl实战笔记(1)基于qt5.15.2+mingw64+opengl绘制三角形
  • 解决因字段过长使MYSQL数据解析超时导致线上CPU告警问题
  • 技术犯规计入个人犯规吗·棒球1号位
  • [C语言]第一章-初识
  • 【Linux】深入理解Linux基础IO:从文件描述符到缓冲区设计
  • Java求职面试:Spring Boot与微服务的幽默探讨
  • 架构思维:构建高并发读服务_异构数据的同步一致性方案
  • C语言:文件操作
  • Cognito
  • Android基于绑定的控件用法
  • 文献分享:CH-CL配对和VL结构域的完整性影响IgG1分泌过程
  • XGBoost算法原理及Python实现
  • K230的ISP(图像信号处理器)通常支持多通道输出,常见配置为3个独立通道
  • CATIA高效工作指南——曲面设计篇(一)
  • 49. 字母异位词分组
  • 高等数学-第七版-下册 选做记录 习题10-2
  • 【C++11】其他一些新特性 | 右值引用 | 完美转发