当前位置: 首页 > news >正文

每天40分玩转Django:Django类视图

Django类视图

一、知识要点概览表

类别知识点掌握程度要求
基础视图View、TemplateView、RedirectView深入理解
通用显示视图ListView、DetailView熟练应用
通用编辑视图CreateView、UpdateView、DeleteView熟练应用
Mixin机制ContextMixin、LoginRequiredMixin理解原理
视图配置URL配置、参数传递、模板指定熟练应用

二、基础视图实现

1. 基本View类

# views.py
from django.views import View
from django.http import HttpResponse
from django.shortcuts import renderclass HelloView(View):def get(self, request, *args, **kwargs):return HttpResponse("Hello, Class-based Views!")def post(self, request, *args, **kwargs):return HttpResponse("POST request received")class DashboardView(View):template_name = 'dashboard.html'def get(self, request):context = {'username': request.user.username,'page_title': 'Dashboard'}return render(request, self.template_name, context)

2. TemplateView使用

# views.py
from django.views.generic import TemplateViewclass HomePageView(TemplateView):template_name = "home.html"def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['page_title'] = '首页'context['features'] = ['基于类的视图','通用视图','Mixin机制']return context

3. RedirectView示例

# views.py
from django.views.generic import RedirectViewclass GitHubRedirectView(RedirectView):url = 'https://github.com'permanent = False  # 使用302临时重定向query_string = True  # 保留查询字符串class OldPostRedirectView(RedirectView):permanent = True  # 使用301永久重定向def get_redirect_url(self, *args, **kwargs):post_id = kwargs['post_id']return f'/blog/posts/{post_id}/'

三、通用显示视图

1. ListView实现

# models.py
from django.db import modelsclass Article(models.Model):title = models.CharField(max_length=200)content = models.TextField()created_at = models.DateTimeField(auto_now_add=True)updated_at = models.DateTimeField(auto_now=True)is_published = models.BooleanField(default=False)def __str__(self):return self.title# views.py
from django.views.generic import ListView
from .models import Articleclass ArticleListView(ListView):model = Articletemplate_name = 'articles/article_list.html'context_object_name = 'articles'paginate_by = 10def get_queryset(self):"""只显示已发布的文章"""return Article.objects.filter(is_published=True).order_by('-created_at')def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['total_articles'] = self.get_queryset().count()return context

2. DetailView实现

# views.py
from django.views.generic import DetailView
from django.shortcuts import get_object_or_404class ArticleDetailView(DetailView):model = Articletemplate_name = 'articles/article_detail.html'context_object_name = 'article'def get_object(self, queryset=None):"""自定义获取对象的方法"""obj = super().get_object(queryset=queryset)# 增加访问次数obj.views_count = obj.views_count + 1obj.save()return objdef get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)# 添加相关文章context['related_articles'] = Article.objects.filter(is_published=True).exclude(id=self.object.id)[:3]return context

四、通用编辑视图

1. CreateView实现

# forms.py
from django import forms
from .models import Articleclass ArticleForm(forms.ModelForm):class Meta:model = Articlefields = ['title', 'content', 'is_published']def clean_title(self):title = self.cleaned_data['title']if len(title) < 5:raise forms.ValidationError("标题长度不能少于5个字符")return title# views.py
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .forms import ArticleFormclass ArticleCreateView(CreateView):model = Articleform_class = ArticleFormtemplate_name = 'articles/article_form.html'success_url = reverse_lazy('article_list')def form_valid(self, form):"""表单验证成功时的处理"""form.instance.author = self.request.userresponse = super().form_valid(form)# 可以在这里添加额外的处理逻辑return responsedef get_initial(self):"""设置表单初始值"""return {'title': '新文章','is_published': False}

2. UpdateView实现

# views.py
from django.views.generic.edit import UpdateView
from django.contrib.auth.mixins import LoginRequiredMixinclass ArticleUpdateView(LoginRequiredMixin, UpdateView):model = Articleform_class = ArticleFormtemplate_name = 'articles/article_update.html'def get_success_url(self):return reverse_lazy('article_detail',kwargs={'pk': self.object.pk})def get_queryset(self):"""确保用户只能编辑自己的文章"""return Article.objects.filter(author=self.request.user)

3. DeleteView实现

# views.py
from django.views.generic.edit import DeleteView
from django.urls import reverse_lazy
from django.contrib.auth.mixins import UserPassesTestMixinclass ArticleDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):model = Articletemplate_name = 'articles/article_confirm_delete.html'success_url = reverse_lazy('article_list')def test_func(self):"""检查用户是否有权限删除文章"""article = self.get_object()return self.request.user == article.authordef delete(self, request, *args, **kwargs):"""自定义删除逻辑"""self.object = self.get_object()success_url = self.get_success_url()# 可以在这里添加其他清理工作self.object.delete()return HttpResponseRedirect(success_url)

五、类视图的URL配置

# urls.py
from django.urls import path
from . import viewsapp_name = 'articles'urlpatterns = [path('', views.ArticleListView.as_view(), name='article_list'),path('<int:pk>/', views.ArticleDetailView.as_view(), name='article_detail'),path('create/', views.ArticleCreateView.as_view(), name='article_create'),path('<int:pk>/update/', views.ArticleUpdateView.as_view(), name='article_update'),path('<int:pk>/delete/', views.ArticleDeleteView.as_view(), name='article_delete'),
]

六、类视图执行流程图

在这里插入图片描述

七、Mixin的使用

1. 自定义Mixin

class TitleMixin:title = ''def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['title'] = self.titlereturn contextclass AuthorRequiredMixin:"""确保用户是作者的Mixin"""def dispatch(self, request, *args, **kwargs):obj = self.get_object()if obj.author != request.user:raise PermissionDeniedreturn super().dispatch(request, *args, **kwargs)class PageTitleMixin:page_title = ''def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['page_title'] = self.page_titlereturn context# 使用Mixin
class ArticleDetailView(TitleMixin, PageTitleMixin, DetailView):model = Articletemplate_name = 'articles/article_detail.html'title = '文章详情'page_title = '查看文章'

2. 常用Mixin组合

from django.contrib.auth.mixins import (LoginRequiredMixin,PermissionRequiredMixin
)class ArticleAdminView(LoginRequiredMixin,PermissionRequiredMixin,ListView
):model = Articletemplate_name = 'articles/admin_list.html'permission_required = 'articles.view_article'def get_queryset(self):return Article.objects.all().order_by('-created_at')class StaffRequiredMixin(UserPassesTestMixin):def test_func(self):return self.request.user.is_staffclass ArticleStaffView(StaffRequiredMixin, ListView):model = Articletemplate_name = 'articles/staff_list.html'

八、模板示例

<!-- templates/articles/article_list.html -->
{% extends 'base.html' %}{% block content %}
<div class="container"><h1>{{ page_title }}</h1><div class="article-list">{% for article in articles %}<div class="article-item"><h2>{{ article.title }}</h2><p>{{ article.content|truncatewords:30 }}</p><div class="article-meta"><span>作者: {{ article.author }}</span><span>发布时间: {{ article.created_at|date:"Y-m-d" }}</span></div><div class="article-actions"><a href="{% url 'articles:article_detail' article.pk %}"class="btn btn-primary">查看详情</a>{% if user == article.author %}<a href="{% url 'articles:article_update' article.pk %}"class="btn btn-secondary">编辑</a><a href="{% url 'articles:article_delete' article.pk %}"class="btn btn-danger">删除</a>{% endif %}</div></div>{% empty %}<p>暂无文章</p>{% endfor %}</div>{% if is_paginated %}<nav aria-label="Page navigation"><ul class="pagination">{% if page_obj.has_previous %}<li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}">上一页</a></li>{% endif %}{% for num in page_obj.paginator.page_range %}<li class="page-item {% if page_obj.number == num %}active{% endif %}"><a class="page-link" href="?page={{ num }}">{{ num }}</a></li>{% endfor %}{% if page_obj.has_next %}<li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}">下一页</a></li>{% endif %}</ul></nav>{% endif %}
</div>
{% endblock %}

这就是关于Django类视图的详细内容。通过学习这些内容,将能够理解和使用Django的类视图系统,实现更加优雅和可维护的视图逻辑。如果有任何问题,欢迎随时提出!


怎么样今天的内容还满意吗?再次感谢朋友们的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

相关文章:

每天40分玩转Django:Django类视图

Django类视图 一、知识要点概览表 类别知识点掌握程度要求基础视图View、TemplateView、RedirectView深入理解通用显示视图ListView、DetailView熟练应用通用编辑视图CreateView、UpdateView、DeleteView熟练应用Mixin机制ContextMixin、LoginRequiredMixin理解原理视图配置U…...

自动化测试之Pytest框架(万字详解)

Pytest测试框架 一、前言二、安装2.1 命令行安装2.2 验证安装 三、pytest设计测试用例注意点3.1 命名规范3.2 断言清晰3.3 fixture3.4 参数化设置3.5 测试隔离3.6 异常处理3.7 跳过或者预期失败3.8 mocking3.9 标记测试 四、以案例初入pytest4.1 第一个pytest测试4.2 多个测试分…...

基于51单片机(STC32G12K128)和8X8彩色点阵屏(WS2812B驱动)的小游戏《贪吃蛇》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、矩阵按键模块3、8X8彩色点阵屏 四、主函数总结 系列文章目录 前言 《贪吃蛇》&#xff0c;一款经典的、怀旧的小游戏&#xff0c;单片机入门必写程序。 以《贪吃蛇》为载体&#xff0c;熟悉各种屏幕…...

2011-2020年各省粗离婚率数据

2011-2020年各省粗离婚率数据 1、时间&#xff1a;2011-2020年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;地区、年份、粗离婚率 4、范围&#xff1a;31省 5、指标解释&#xff1a;粗离婚率指某地区当年离婚对数占该地区年平均人口的比重。计算公式为&#xff1a…...

C++高级编程技巧:模板元编程与性能优化实践

C高级编程技巧&#xff1a;模板元编程与性能优化实践 在C编程的世界里&#xff0c;模板元编程&#xff08;Template Metaprogramming&#xff09;是一项强大的技术&#xff0c;它允许程序员在编译时而非运行时进行计算和类型操作。这项技术的核心在于C模板系统&#xff0c;它…...

Mac 版本向日葵退出登录账号

找遍整个软件&#xff0c;Mac 版本的向日葵甚至逆天到没有提供退出登录的功能… 随后我发现可以直接删除向日葵的配置文件达到退出登录的效果&#xff0c;具体操作如下&#xff1a; cd /etc # 确认存在 orayconfig.conf 文件 ls orayconfig.conf  # 删除 sudo rm -f oray…...

SOLIDWORKS Composer在产品设计、制造与销售中的应用

SOLIDWORKS Composer是一款专为技术团队设计的高效沟通工具&#xff0c;广泛应用于产品设计、制造、销售及售后等领域。它能从复杂的CAD数据中提取关键信息&#xff0c;轻松转化为高质量的产品文档、交互式3D动画及说明视频&#xff0c;显著提升产品沟通效率。 Composer擅长制…...

Win11+WLS Ubuntu 鸿蒙开发环境搭建(一)

参考文章 Windows11安装linux子系统 WSL子系统迁移、备份与导入全攻略 如何扩展 WSL 2 虚拟硬盘的大小 Win10安装的WSL子系统占用磁盘空间过大如何释放 《Ubuntu — 调整文件系统大小命令resize2fs》 penHarmony南向开发笔记&#xff08;一&#xff09;开发环境搭建 一&a…...

[CSAW/网络安全] Git泄露+命令执行 攻防世界 mfw 解题详析

Home界面&#xff1a; Home界面翻译如下&#xff1a; 欢迎访问我的网站&#xff01; 我自己从头开始写的&#xff01; 您可以使用上面的链接浏览页面&#xff01; About界面&#xff1a; 观察到Git&#xff0c;联想Git泄露 Git泄露 Git是一个非常流行的开源分布式版本控制系…...

MySQL 锁那些事

Q1 : MySQL有哪些锁,功能是什么,如何项目中使用?Q2 : 行锁是如何实现的?什么情况下会使用行锁?Q3 : 四种事务隔离形式的行锁有什么不一样?读未提交读提交可重复读串行 Q4 : MySQL 的读写都是怎样加锁的?Q5 : 需要注意什么? Q1 : MySQL有哪些锁,功能是什么,如何项目中使用…...

Linux中常用的基本指令和一些配套的周边知识详解

目录 一些基本指令 一些常用指令 注&#xff1a;配套的周边知识是直接跟在指令的讲解后面的。 补充&#xff1a;(重要) 如何看待这么多指令&#xff1f;&#xff1f;&#xff1f;记不住怎么办&#xff1f;&#xff1f;&#xff1f; 首先&#xff0c;指令不用刻意去记&#xf…...

深入理解Java中的Set集合:特性、用法与常见操作指南

一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 ①&#xff1a;add(Object o)&#xff1a;向Set集合中添加元素&#xff0c;不允许添加重复数据。 ②&#xff1a;size()&#xff1a;返回Set集合中的元素个数 ③.remove(Object o)&#xff1a; 删除Set集合中的obj对…...

Oracle 使用 sql profile 固定执行计划

测试使用 sql profile 固定执行计划&#xff1a; Oracle 10g之前有outlines,10g之后 sql profile 。如果针对非绑定变量的sql,outlines则效果不佳&#xff0c;不建议使用 。 1、准备测试用表 SQL> create table zzh_ob as select * from dba_objects; SQL> create inde…...

数字电路期末复习

*前言&#xff1a;*写的东西不太全面&#xff0c;更多的是一个复习大纲&#xff0c;让你发现自己有哪些不懂的问题&#xff08;不懂的地方就去翻书或者问AI&#xff09;&#xff0c;如果能够解决提出的所有问题&#xff0c;那么过期末考一定不是问题。 这里写目录标题 数制和码…...

正则表达式 - 使用总结

正则表达式 - 使用总结 正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许我们通过特定的模式(pattern)来搜索、匹配和操作字符串。在编程、数据分析和文本处理等领域,正则表达式发挥着非常重要的作用。本文将总结正则表达式的基本概念、使用方…...

通过Xshell远程连接wsl2

目录 一、WSL网络原理 二、 下载XShell 三、Ubuntu里配置ssh 1.查看是否已经安装SSH 2.安装SSH 3.修改SSH配置 4.重启ssh 5.查看ip 四、在Xshell中链接电脑 五、设置端口转发 1.设置主机端口映射到wsl2的端口 六、防火墙设置开放8989端口 方式一(推荐): 方式二:…...

【ubuntu】安装OpenSSH服务器

参考:https://blog.csdn.net/fanjufei123456/article/details/139264814 要在Ubuntu上使用SSH连接&#xff0c;需要确保系统上安装并运行了SSH服务器。SSH服务器负责接受来自其他计算机的SSH连接请求&#xff0c;并提供对目标系统的访问权限。 在Ubuntu上&#xff0c;默认情况…...

CESS 的 2024:赋能 AI,塑造去中心化数据基础

2024 年是加密与区块链行业的重要转折之年&#xff0c;行业在技术创新、监管明确和实际应用上取得了显著进展。全球范围内&#xff0c;多个国家相继推出加密货币和区块链技术的监管框架&#xff0c;美国的区块链政策峰会推动了关键议题的讨论&#xff0c;欧洲完成了 MiCA 监管的…...

Redission红锁

目录 一、什么是红锁 二、Redission红锁的使用 一、什么是红锁 Redis 的作者 Salvatore Sanfilippo&#xff08;又名 antirez&#xff09;提出的一种基于多个 Redis 实例实现分布式锁的算法。红锁&#xff08;Redlock&#xff09;旨在解决单点故障问题&#xff0c;即当使用单…...

使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色

定义 ::selection 伪元素&#xff1a; 在你的 CSS 文件中&#xff0c;添加 ::selection 伪元素&#xff0c;并设置 background-color 属性来改变选中文本的背景颜色。 示例代码&#xff1a; ::selection {background-color: yellow; /* 你可以根据需要更改颜色 */color: black…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中&#xff0c;要设置一个操作在指定延迟后&#xff08;例如3秒&#xff09;执行&#xff0c;可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法&#xff0c;它接受两个参数&#xff1a; 要执行的函数&…...

HTML中各种标签的作用

一、HTML文件主要标签结构及说明 1. <&#xff01;DOCTYPE html> 作用&#xff1a;声明文档类型&#xff0c;告知浏览器这是 HTML5 文档。 必须&#xff1a;是。 2. <html lang“zh”>. </html> 作用&#xff1a;包裹整个网页内容&#xff0c;lang"z…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

二维数组 行列混淆区分 js

二维数组定义 行 row&#xff1a;是“横着的一整行” 列 column&#xff1a;是“竖着的一整列” 在 JavaScript 里访问二维数组 grid[i][j] 表示 第i行第j列的元素 let grid [[1, 2, 3], // 第0行[4, 5, 6], // 第1行[7, 8, 9] // 第2行 ];// grid[i][j] 表示 第i行第j列的…...