django从入门到实战(三)——CBV视图介绍

在 Django 中,不同类型的视图(如数据显示视图、数据操作视图和日期筛选视图)都有各自的方法和参数。以下是对这些视图及其方法的详细介绍。

1. 数据显示视图

1.1 重定向视图

方法:

  • redirect(): 用于重定向到另一个 URL。

使用示例:

python 复制代码
from django.shortcuts import redirect

def my_view(request):
    # 处理某些逻辑
    return redirect('home')  # 重定向到首页

参数:

  • to: 可以是 URL 字符串、URL 名称或一个可调用对象。
  • permanent: 布尔值,指示是否进行永久重定向(默认值为 False)。
1.2 基础视图

方法:

  • HttpResponse(): 返回简单的文本或 HTML 内容。

使用示例:

python 复制代码
from django.http import HttpResponse

def basic_view(request):
    return HttpResponse("这是一个基础视图")

参数:

  • content: 响应内容(字符串)。
  • status: HTTP 状态码(默认值为 200)。
  • content_type: 响应内容类型(如 text/html)。
1.3 列表视图

方法:

  • get_queryset(): 返回要显示的对象列表。
  • get_context_data(): 返回上下文数据。

使用示例:

python 复制代码
from django.views.generic import ListView
from .models import Post

class PostListView(ListView):
    model = Post
    template_name = 'post_list.html'
    context_object_name = 'posts'

    def get_queryset(self):
        return Post.objects.filter(published=True)  # 只显示已发布的帖子

参数:

  • model: 关联的模型类。
  • template_name: 使用的模板名称。
  • context_object_name: 上下文变量名称(默认为 object_list)。
1.4 详细视图

方法:

  • get_object(): 返回要显示的对象。
  • get_context_data(): 返回上下文数据。

使用示例:

python 复制代码
from django.views.generic import DetailView
from .models import Post

class PostDetailView(DetailView):
    model = Post
    template_name = 'post_detail.html'
    context_object_name = 'post'

    def get_object(self):
        return super().get_object()  # 获取当前帖子对象

参数:

  • model: 关联的模型类。
  • template_name: 使用的模板名称。
  • context_object_name: 上下文变量名称(默认为 object)。

2. 数据操作视图

2.1 表单视图

方法:

  • form_valid(): 处理有效表单提交。
  • form_invalid(): 处理无效表单提交。
  • get_form(): 获取表单实例。

使用示例:

python 复制代码
from django.views.generic.edit import FormView
from .forms import PostForm

class PostCreateView(FormView):
    template_name = 'post_form.html'
    form_class = PostForm
    success_url = '/posts/'

    def form_valid(self, form):
        form.save()  # 保存表单数据
        return super().form_valid(form)

参数:

  • template_name: 使用的模板名称。
  • form_class: 表单类。
  • success_url: 提交成功后重定向的 URL。
2.2 新增视图

新增视图通常与表单视图结合使用,允许用户创建新记录。使用 FormView 或 CreateView。

示例:

python 复制代码
from django.views.generic.edit import CreateView

class PostCreateView(CreateView):
    model = Post
    template_name = 'post_form.html'
    form_class = PostForm
    success_url = '/posts/'

参数:

  • model: 关联的模型类。
  • template_name: 使用的模板名称。
  • form_class: 表单类。
  • success_url: 提交成功后重定向的 URL。
2.3 修改视图

修改视图用于更新现有记录,使用 UpdateView。

示例:

python 复制代码
from django.views.generic.edit import UpdateView

class PostUpdateView(UpdateView):
    model = Post
    template_name = 'post_form.html'
    form_class = PostForm
    success_url = '/posts/'

参数:

  • model: 关联的模型类。
  • template_name: 使用的模板名称。
  • form_class: 表单类。
  • success_url: 提交成功后重定向的 URL。
2.4 删除视图

删除视图用于删除现有记录,使用 DeleteView。

示例:

python 复制代码
from django.views.generic.edit import DeleteView

class PostDeleteView(DeleteView):
    model = Post
    template_name = 'post_confirm_delete.html'
    success_url = '/posts/'

参数:

  • model: 关联的模型类。
  • template_name: 使用的模板名称。
  • success_url: 删除成功后重定向的 URL。

3. 日期筛选视图

3.1 月份视图

方法:

  • get_queryset(): 返回特定月份的数据。

使用示例:

python 复制代码
from django.shortcuts import render
from .models import Post

def posts_by_month(request, year, month):
    posts = Post.objects.filter(
        created_at__year=year,
        created_at__month=month
    )
    return render(request, 'posts_by_month.html', {'posts': posts})

参数:

  • year: 年份(整数)。
  • month: 月份(整数)。
3.2 周期视图

方法:

  • get_queryset(): 返回特定时间段的数据。

使用示例:

python 复制代码
from django.shortcuts import render
from .models import Post

def posts_in_period(request, start_date, end_date):
    posts = Post.objects.filter(
        created_at__range=[start_date, end_date]
    )
    return render(request, 'posts_in_period.html', {'posts': posts})

参数:

  • start_date: 开始日期(字符串或日期对象)。
  • end_date: 结束日期(字符串或日期对象)。
相关推荐
弈栈录1 分钟前
用户、会话与消息表应该如何设计
数据库·后端
内存漫游7 分钟前
Checkpoint 与 Crash Recovery:数据库恢复机制入门
数据库
2301_7867566017 分钟前
中科院分区表停发后,期刊评价的技术逻辑:从期刊超越指数到多指标选刊方案
java·数据库·windows
闲云野鹤在人间20 分钟前
Ubuntu 24.04 安装过程
服务器·数据库·ubuntu
Wx-bishekaifayuan25 分钟前
springboot铜仁非遗之家76938-计算机课程设计、毕业设计
java·spring boot·后端·spring·django·课程设计·旅游
duxingzhe03111 小时前
我的一些书
java·数据库·tomcat·数据库开发·etl工程师
2603_965148111 小时前
商品价格监控 API 接口:从原理到实战的完整指南
java·前端·数据库·python·生活
AllData公司负责人1 小时前
AllData搭建AI中台,集成开源项目LabelStudio/CubeStudio,建设数据标注平台/机器学习平台
数据库·人工智能·机器学习·labelstudio·cubestudio
2601_962071002 小时前
Kimi K3 vs DeepSeek V4-Pro实测对比:2026年同一入口十道题,耗时与token消耗差在哪
android·java·数据库