pin_drop当前位置:知识文库 ❯ 图文

Django View视图完整教程:函数视图与类视图详解 - 零基础入门指南

一、View视图概述

View(视图)是Django MVT架构中的核心组件,负责处理HTTP请求并返回HTTP响应。视图是连接URL路由和模板的桥梁,接收用户请求、处理业务逻辑、最终将结果返回给客户端。

Django支持两种视图编写风格:函数视图(FBV)和类视图(CBV)。函数视图简单直观,适合快速开发;类视图支持继承和混入(Mixin),代码复用性更高,适合大型项目。


二、函数视图(FBV)详解

函数视图是最基础的Django视图形式,使用Python函数定义,接收request对象作为第一个参数,返回HttpResponse对象。

基础函数视图

代码示例

from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect

def index(request):
    """首页视图"""
    return HttpResponse('欢迎访问首页')

def about(request):
    """关于页面"""
    context = {'title': '关于我们', 'content': '这是一个Django项目'}
    return render(request, 'about.html', context)

def api_data(request):
    """API视图"""
    data = {'name': 'Django', 'version': '5.0'}
    return JsonResponse(data)

def redirect_view(request):
    """重定向视图"""
    return redirect('/about/')

常用响应类型

函数视图可以返回多种响应类型,满足不同场景需求:

  • HttpResponse:基础响应,返回纯文本或HTML内容

  • JsonResponse:JSON格式响应,适用于API接口

  • render:渲染模板并返回HTML响应

  • redirect:HTTP重定向到另一个URL

  • HttpResponseNotFound:返回404状态码

  • HttpResponseForbidden:返回403禁止访问状态码


三、类视图(CBV)详解

类视图基于Python类实现,通过不同的方法处理不同的HTTP请求(GET、POST、PUT、DELETE等)。类视图支持继承和Mixin混入,可以大幅提高代码复用率。

基础类视图

代码示例

from django.views import View
from django.http import HttpResponse, JsonResponse

class HelloView(View):
    """基础类视图"""
    def get(self, request):
        return HttpResponse('Hello from CBV!')

    def post(self, request):
        name = request.POST.get('name', 'Guest')
        return JsonResponse({'message': f'Hello, {name}!'})

类视图的URL配置

类视图在urls.py中需要使用.as_view()方法转换为可调用的视图函数:

代码示例

from django.urls import path
from .views import HelloView

urlpatterns = [
    path('hello/', HelloView.as_view(), name='hello'),
]

小贴士

类视图会自动根据HTTP请求方法(GET/POST/PUT/DELETE)分发到对应的方法处理,无需手动判断request.method,这是类视图相比函数视图的一大优势。


四、HttpRequest与HttpResponse对象

HttpRequest对象属性

属性 类型 说明
method str 请求方法(GET/POST/PUT/DELETE等)
GET QueryDict GET请求参数
POST QueryDict POST请求参数
FILES MultiValueDict 上传的文件数据
COOKIES dict Cookie字典
META dict 请求头和环境变量
path str 请求的完整路径
user User 当前登录用户(需认证中间件)

HttpResponse类型

类 说明
HttpResponse 基础HTTP响应
JsonResponse JSON格式响应,自动设置Content-Type为application/json
HttpResponseRedirect 302临时重定向
HttpResponseNotFound 404未找到响应
HttpResponseForbidden 403禁止访问响应

五、通用类视图实战

Django提供了丰富的通用类视图(Generic Class-Based Views),可以快速实现常见的CRUD操作,大幅减少模板代码。

常用类视图类型

类 说明
View 基础类视图,所有CBV的基类
TemplateView 直接渲染模板,无需额外逻辑
ListView 列表视图,展示模型对象列表
DetailView 详情视图,展示单个模型对象
CreateView 创建视图,处理对象创建表单
UpdateView 更新视图,处理对象编辑表单
DeleteView 删除视图,处理对象删除确认

ListView和DetailView实战

代码示例

from django.views.generic import ListView, DetailView
from .models import Article

class ArticleListView(ListView):
    """文章列表视图"""
    model = Article
    template_name = 'article_list.html'
    context_object_name = 'articles'
    paginate_by = 10

    def get_queryset(self):
        return super().get_queryset().filter(status='published')

class ArticleDetailView(DetailView):
    """文章详情视图"""
    model = Article
    template_name = 'article_detail.html'
    context_object_name = 'article'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['related_articles'] = Article.objects.filter(
            category=self.object.category
        ).exclude(pk=self.object.pk)[:5]
        return context

六、表单提交处理

使用类视图处理表单提交时,GET请求用于渲染表单页面,POST请求用于处理提交的数据。下面是一个完整的联系表单处理示例:

代码示例

from django.views import View
from django.shortcuts import render, redirect
from django.contrib import messages

class ContactView(View):
    """联系表单视图"""
    def get(self, request):
        return render(request, 'contact.html')

    def post(self, request):
        name = request.POST.get('name', '')
        email = request.POST.get('email', '')
        message = request.POST.get('message', '')

        if not name or not email:
            messages.error(request, '姓名和邮箱不能为空')
            return render(request, 'contact.html', {
                'name': name, 'email': email, 'message': message
            })

        # 处理表单数据(保存到数据库或发送邮件)...
        messages.success(request, '提交成功!')
        return redirect('contact')

提示:POST请求必须包含CSRF令牌,在模板中使用 {% csrf_token %} 标签生成。否则Django会拒绝该请求并返回403错误。


七、FBV与CBV对比

函数视图和类视图各有优势,选择哪种方式取决于项目的复杂度和团队偏好。

特性 函数视图(FBV) 类视图(CBV)
定义方式 def view(request) class View(View)
代码量 少 稍多
复用性 低 高(继承和Mixin)
请求分发 手动判断method 自动按方法分发
装饰器 直接添加 需method_decorator
适用场景 简单逻辑 复杂/复用逻辑

八、注意事项与最佳实践

注意:视图必须返回HttpResponse对象或其子类实例,不能返回None或普通字符串,否则会抛出异常。

注意:POST请求需要CSRF令牌保护,在HTML表单中使用 {% csrf_token %} 模板标签生成隐藏字段。

注意:类视图在urls.py中必须使用 .as_view() 方法转换为可调用对象,不能直接引用类名。

注意:在函数视图中使用 request.method 判断请求类型,而在类视图中会自动按HTTP方法分发到对应的get()、post()等方法。

小贴士

对于简单的视图(如静态页面、API接口),推荐使用函数视图,代码更简洁。对于需要复用的视图(如CRUD操作),推荐使用通用类视图,可以节省大量模板代码。


九、练习题

练习一

编写一个函数视图,接收GET请求时返回当前时间(格式为YYYY-MM-DD HH:MM:SS),接收POST请求时返回提交的表单数据(JSON格式)。

练习二

使用ListView和DetailView分别实现文章列表和文章详情页面。列表页需要支持分页(每页10条),详情页需要展示相关文章推荐。

常见问题

函数视图和类视图应该如何选择?

对于简单的视图逻辑(如返回静态页面、简单的API接口),推荐使用函数视图,代码更简洁直观。对于需要复用的视图(如CRUD操作、需要继承和混入的场景),推荐使用类视图,代码复用性更高,维护性更好。

类视图如何添加装饰器?

类视图不能直接使用装饰器,需要使用 @method_decorator 装饰器。可以在类上使用 @method_decorator(login_required, name='dispatch'),也可以在 dispatch 方法上使用。

JsonResponse和普通HttpResponse有什么区别?

JsonResponse会自动将Python字典转换为JSON字符串,并设置Content-Type为application/json。而HttpResponse需要手动序列化JSON并设置Content-Type,JsonResponse更加方便快捷。

通用类视图如何自定义查询集?

重写 get_queryset() 方法可以自定义查询集。例如在ListView中,可以返回过滤后的查询集:def get_queryset(self): return Article.objects.filter(status='published')。

视图返回404状态码的最佳实践是什么?

推荐使用 get_object_or_404() 快捷函数,它会在对象不存在时自动抛出Http404异常。也可以使用 HttpResponseNotFound 直接返回404响应,但前者更加简洁。

标签: Django View视图 函数视图 类视图 CBV FBV Python

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Django Model模型 - ORM字段类型与数据库关系详解 下一篇: Django Template模板完整教程:模板语言与继承实战 - 零基础入门

poll相关推荐