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 新增视图

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

示例

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: 结束日期(字符串或日期对象)。
相关推荐
严同学正在努力2 小时前
从备份到恢复:我用 30 分钟恢复了误删的核心业务表
android·java·数据库·ai
#六脉神剑3 小时前
myBuilder新版本(8月,Office文件预览、Oracle数据库支持)
数据库·oracle·开发平台·数字化工具·mybuilder
花青泽3 小时前
5-数据库-SQL注入-联合查询-AND/OR绕过-day13
数据库·sql
踏着七彩祥云的小丑3 小时前
忘记Redis是否安装过时查看
数据库·redis·缓存
Nontee4 小时前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式
眞bilibili5 小时前
带团队后的日常思考(十七)
数据库
laboratory agent开发5 小时前
智能体多工具串联执行中途失败,部分写入的数据如何回滚
运维·服务器·数据库
段一凡-华北理工大学6 小时前
AI推动工业智能化转型~系列文章07:分类与诊断算法体系:故障识别的完整工具箱
数据库·人工智能·算法·机器学习·分类·数据挖掘·高炉炼铁智能化
Python私教6 小时前
Django 6.1 邮件配置大改:旧项目如何平稳升级?
后端·python·django
Python私教6 小时前
Django 6.1 升级避坑:数据库版本不兼容怎么解决?
后端·python·django