Python编程之Django模块详细学习教程

Python编程之Django模块详细学习教程

目录

  1. Django简介与安装
  2. 创建第一个Django项目
  3. Django应用(App)的概念与使用
  4. 模型(Models)与数据库交互
  5. 管理后台(Admin)的使用
  6. 视图(Views)与URL配置
  7. 模板(Templates)的使用
  8. 表单(Forms)的处理
  9. 用户认证与权限
  10. 静态文件与媒体文件处理
  11. 中间件(Middleware)
  12. 信号(Signals)
  13. 测试(Testing)
  14. 部署Django项目
  15. 综合应用案例:一个简单的博客系统

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

综合应用案例:一个简单的博客系统

案例介绍

这是一个简单的博客系统,包含文章列表、文章详情、创建文章、用户认证等功能。

代码实现

  1. 模型定义
# 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
  1. 视图函数
# 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})
  1. 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'),
]
  1. 模板文件
<!-- 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>
  1. 表单定义
# 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的高级特性和最佳实践。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一剑的CS_DN博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值