Python编程之Django模块详细学习教程
目录
- Django简介与安装
- 创建第一个Django项目
- Django应用(App)的概念与使用
- 模型(Models)与数据库交互
- 管理后台(Admin)的使用
- 视图(Views)与URL配置
- 模板(Templates)的使用
- 表单(Forms)的处理
- 用户认证与权限
- 静态文件与媒体文件处理
- 中间件(Middleware)
- 信号(Signals)
- 测试(Testing)
- 部署Django项目
- 综合应用案例:一个简单的博客系统
Django简介与安装
详细介绍
Django是一个高级Python Web框架,它鼓励快速开发和干净、实用的设计。它遵循MVT(模型-视图-模板)设计模式。Django自带了许多内置功能,如认证、管理后台等,使得开发Web应用更加高效。
安装Django之前,确保已经安装了Python。推荐使用Python 3.6或更高版本。
案例1:使用pip安装Django
# 使用pip安装Django,以下命令在命令行中执行
pip install django
案例2:验证Django安装
# 在命令行中输入以下命令,检查Django版本,确保安装成功
python -m django --version
创建第一个Django项目
详细介绍
Django项目是Django实例的一系列设置的集合,包括数据库配置、Django特定选项和应用特定设置。
使用django-admin命令可以创建一个新的Django项目。
案例1:创建项目
# 创建一个名为myproject的Django项目
django-admin startproject myproject
案例2:运行开发服务器
# 进入项目目录
cd myproject
# 启动开发服务器,默认端口8000
python manage.py runserver
Django应用(App)的概念与使用
详细介绍
在Django中,项目由多个应用组成。每个应用是一个独立的模块,负责完成一个特定的任务。例如,一个博客项目可能有博客文章应用、评论应用等。
案例1:创建应用
# 在项目目录下,创建一个名为blog的应用
python manage.py startapp blog
案例2:注册应用
在项目的settings.py文件中,将新创建的应用添加到INSTALLED_APPS列表中。
# myproject/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # 添加blog应用
]
模型(Models)与数据库交互
详细介绍
模型是Django中与数据库交互的核心部分。每个模型类对应数据库中的一张表,类的属性对应表的字段。Django支持多种数据库,如SQLite、PostgreSQL、MySQL等。
案例1:定义简单的模型
# blog/models.py
from django.db import models
class Post(models.Model): # 定义一个博客文章模型
title = models.CharField(max_length=200) # 标题字段,字符类型,最大长度200
content = models.TextField() # 内容字段,文本类型
created_at = models.DateTimeField(auto_now_add=True) # 创建时间字段,自动添加当前时间
def __str__(self):
return self.title # 返回文章标题,用于在管理后台显示
案例2:进行数据库迁移
# 生成迁移文件
python manage.py makemigrations
# 应用迁移,创建数据库表
python manage.py migrate
管理后台(Admin)的使用
详细介绍
Django自带一个强大的管理后台,可以方便地对数据库中的数据进行增删改查操作。只需简单注册模型,即可在管理后台中管理数据。
案例1:注册模型到管理后台
# blog/admin.py
from django.contrib import admin
from .models import Post # 导入Post模型
admin.site.register(Post) # 注册Post模型到管理后台
案例2:创建超级用户
# 创建超级用户,用于登录管理后台
python manage.py createsuperuser
视图(Views)与URL配置
详细介绍
视图是Django中处理请求并返回响应的组件。URL配置则是将URL映射到相应的视图函数。
案例1:编写一个简单的视图
# blog/views.py
from django.http import HttpResponse
def post_list(request): # 定义一个视图函数,显示所有文章
return HttpResponse("这里是文章列表页面") # 返回一个简单的HTTP响应
案例2:配置URL
# blog/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('posts/', views.post_list, name='post_list'), # 将URL /posts/ 映射到post_list视图
]
# myproject/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')), # 包含blog应用的URL配置
]
模板(Templates)的使用
详细介绍
模板用于生成动态HTML页面。Django模板语言(DTL)允许在HTML中嵌入变量、标签和过滤器。
案例1:创建模板
<!-- blog/templates/blog/post_list.html -->
<!DOCTYPE html>
<html>
<head>
<title>文章列表</title>
</head>
<body>
<h1>所有文章</h1>
<ul>
{% for post in posts %} <!-- 使用for循环遍历文章列表 -->
<li>{{ post.title }} - {{ post.created_at }}</li> <!-- 显示文章标题和创建时间 -->
{% endfor %}
</ul>
</body>
</html>
案例2:在视图中使用模板
# blog/views.py
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all() # 获取所有文章
return render(request, 'blog/post_list.html', {'posts': posts}) # 渲染模板并传递数据
表单(Forms)的处理
详细介绍
Django表单用于处理用户输入,包括验证和数据清洗。Django提供了Form和ModelForm两种表单类。
案例1:创建表单
# blog/forms.py
from django import forms
from .models import Post
class PostForm(forms.ModelForm): # 基于Post模型创建表单
class Meta:
model = Post
fields = ['title', 'content'] # 表单包含的字段
案例2:处理表单提交
# blog/views.py
from django.shortcuts import redirect
from .forms import PostForm
def create_post(request):
if request.method == 'POST': # 如果是POST请求
form = PostForm(request.POST) # 使用提交的数据初始化表单
if form.is_valid(): # 验证表单数据
form.save() # 保存数据到数据库
return redirect('post_list') # 重定向到文章列表页面
else:
form = PostForm() # 如果是GET请求,初始化一个空表单
return render(request, 'blog/create_post.html', {'form': form}) # 渲染表单页面
用户认证与权限
详细介绍
Django内置了用户认证系统,包括用户注册、登录、注销、权限管理等功能。
案例1:用户登录视图
# blog/views.py
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
def user_login(request):
if request.method == 'POST':
username = request.POST['username'] # 获取用户名
password = request.POST['password'] # 获取密码
user = authenticate(request, username=username, password=password) # 认证用户
if user is not None:
login(request, user) # 登录用户
return redirect('post_list')
else:
return render(request, 'blog/login.html', {'error': '用户名或密码错误'})
return render(request, 'blog/login.html')
案例2:限制视图访问
# blog/views.py
from django.contrib.auth.decorators import login_required
@login_required # 装饰器,要求用户登录后才能访问
def create_post(request):
# 视图代码
pass
静态文件与媒体文件处理
详细介绍
静态文件(如CSS、JavaScript、图片)和媒体文件(用户上传的文件)在Django中有不同的处理方式。
案例1:配置静态文件
# myproject/settings.py
STATIC_URL = '/static/' # 静态文件的URL前缀
STATICFILES_DIRS = [BASE_DIR / "static"] # 静态文件存放的目录
<!-- 在模板中加载静态文件 -->
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">
案例2:处理媒体文件
# myproject/settings.py
MEDIA_URL = '/media/' # 媒体文件的URL前缀
MEDIA_ROOT = BASE_DIR / "media" # 媒体文件存放的目录
# myproject/urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... 其他URL配置
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # 开发环境下提供媒体文件服务
中间件(Middleware)
详细介绍
中间件是Django请求/响应处理的钩子框架,用于全局修改Django的输入或输出。
案例1:自定义中间件
# blog/middleware.py
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 请求处理前的逻辑
response = self.get_response(request) # 调用下一个中间件或视图
# 响应处理后的逻辑
return response
案例2:注册中间件
# myproject/settings.py
MIDDLEWARE = [
# ... 其他中间件
'blog.middleware.SimpleMiddleware', # 添加自定义中间件
]
信号(Signals)
详细介绍
信号允许某些发送者通知一组接收者某些操作已经发生。Django内置了许多信号,如模型保存前后、请求开始结束等。
案例1:使用内置信号
# blog/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Post
@receiver(post_save, sender=Post) # 监听Post模型的保存信号
def notify_on_post_save(sender, instance, created, **kwargs):
if created: # 如果是新创建的文章
print(f"新文章创建: {instance.title}")
案例2:注册信号
# blog/apps.py
from django.apps import AppConfig
class BlogConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'blog'
def ready(self):
import blog.signals # 导入信号处理模块
测试(Testing)
详细介绍
Django提供了强大的测试框架,支持单元测试、集成测试等。测试代码位于各应用的tests.py文件中。
案例1:编写模型测试
# blog/tests.py
from django.test import TestCase
from .models import Post
class PostModelTest(TestCase):
def test_create_post(self): # 测试创建文章
post = Post.objects.create(title="测试标题", content="测试内容")
self.assertEqual(post.title, "测试标题") # 断言标题正确
案例2:编写视图测试
# blog/tests.py
from django.urls import reverse
class PostViewTest(TestCase):
def test_post_list_view(self): # 测试文章列表视图
response = self.client.get(reverse('post_list')) # 模拟访问文章列表页面
self.assertEqual(response.status_code, 200) # 断言响应状态码为200
部署Django项目
详细介绍
Django项目可以部署到各种服务器环境,如Apache、Nginx、Gunicorn等。部署时需要考虑静态文件收集、数据库配置、安全性等问题。
案例1:收集静态文件
# 收集所有静态文件到STATIC_ROOT目录
python manage.py collectstatic
案例2:使用Gunicorn部署
# 安装Gunicorn
pip install gunicorn
# 启动Gunicorn服务
gunicorn myproject.wsgi:application
综合应用案例:一个简单的博客系统
案例介绍
这是一个简单的博客系统,包含文章列表、文章详情、创建文章、用户认证等功能。
代码实现
- 模型定义
# blog/models.py
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE) # 外键关联用户
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
- 视图函数
# blog/views.py
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from .models import Post
from .forms import PostForm
def post_list(request):
posts = Post.objects.all()
return render(request, 'blog/post_list.html', {'posts': posts})
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
@login_required
def create_post(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm()
return render(request, 'blog/create_post.html', {'form': form})
- URL配置
# blog/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
path('post/<int:pk>/', views.post_detail, name='post_detail'),
path('post/new/', views.create_post, name='create_post'),
]
- 模板文件
<!-- blog/templates/blog/post_list.html -->
<!DOCTYPE html>
<html>
<head>
<title>博客文章列表</title>
</head>
<body>
<h1>所有文章</h1>
<a href="{% url 'create_post' %}">写新文章</a>
<ul>
{% for post in posts %}
<li><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a> by {{ post.author.username }}</li>
{% endfor %}
</ul>
</body>
</html>
- 表单定义
# blog/forms.py
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
这个简单的博客系统包含了基本的CRUD操作和用户认证功能,展示了Django各个组件的综合应用。
通过本教程,您应该对Django的核心概念和基本用法有了全面的了解。Django是一个功能强大且灵活的框架,适合开发各种规模的Web应用程序。继续学习和实践将帮助您更好地掌握Django的高级特性和最佳实践。
4万+

被折叠的 条评论
为什么被折叠?



