每天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大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IndexOf Apache Web For Liunx索引服务器部署及应用

Apache HTTP Server 是一款广泛使用的开源网页服务器软件,它支持多种协议,包括 HTTP、HTTPS、FTP 等 IndexOf 功能通常指的是在一个目录中自动生成一个索引页面的能力,这个页面会列出该目录下所有的文件和子目录。比如网上经常看到的下图展现的效果,那么接下来我们就讲一下…

Nginx之Rewrite功能配置

一、Rewrite功能配置介绍 Rewrite是Nginx服务器提供的一个重要基本功能&#xff0c;是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持&#xff0c;因此在编译安装Nginx服务器之前&#xff0c;需要安装…

C++的第一个程序

前言 在学习c之前&#xff0c;你一定还记得c语言的第一个程序 当时刚刚开始进行语言学习 因此告诉到&#xff0c;仅仅需要记住就可以 #include <stdio.h>int main(){printf("Hello World");return 0; }而对于c中的第一个程序&#xff0c;似乎有所变化 C的…

ipad如何直连主机(Moonlight Sunshine)

Windows 被连接主机&#xff08;Windows&#xff09; 要使用的话需要固定ip&#xff0c;不然ip会换来换去&#xff0c;固定ip方法本人博客有记载Github下载Sunshine Sunshine下载地址除了安装路径需要改一下&#xff0c;其他一路点安装完成后会打开Sunshine的Web UI&#xff…

mac docker部署jar包流程

mac docker部署jar包流程 默认服务器已经准备好了相关的准备工作&#xff0c;如&#xff1a;docker&#xff0c;docker内安装所需软件数据库&#xff0c;jdk等&#xff0c;将要部署等jar包。 1:将jar 包上传到服务器目录下&#xff1a;/usr/local/service (没有目录可以自己创建…

机器算法之逻辑回归(Logistic Regression)详解

一、什么是逻辑回归&#xff1f; 逻辑回归并不是传统意义上的回归分析&#xff0c;而是一种用于处理二分类问题的线性模型。它通过计算样本属于某一类别的概率来进行分类&#xff0c;尽管名字中有“回归”二字&#xff0c;但它实际上是一种分类算法。简单来说&#xff0c;逻辑…

Qt -初识

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4da; 前言&#x1f6e0;️ 搭建环境&#x1f4c2; 新建项目&#x1f4dd; 初始代码理解main.cppwidget.hwidget.cppwidget.uiHelloWorld.pro&#x1f6e…

2024.12.30(多点通信)

作业&#xff1a; 1、将广播发送和接收端实现一遍&#xff0c;完成一个发送端发送信息&#xff0c;对应多个接收端接收信息实验。 发送端 #include <myhead.h>#define PORT 8888 #define IP "192.168.124.255"int main(int argc, const char *argv[]) {//1、…

MySQL什么情况下会加间隙锁?

目录 一、使用范围条件查询 二、唯一索引的范围查询 三、普通索引的查询 四、间隙锁的锁定规则 五、间隙锁的影响 间隙锁(Gap Lock)是MySQL中的一种锁机制,主要用于防止幻读现象。在MySQL的InnoDB存储引擎中,当事务隔离级别设置为可重复读(Repeatable Read)时,间隙…

点进CSS选择器

CSS 1.直接在标签的style属性进行设置(行内式) //写在数据单元格td标签内的stytle&#xff0c;设置color颜色和font-size字体大小&#xff1b; <td rowspan"3" style"color: red;font-size: 12px;">Web技术与应用</td> 2.写在head标签中的…

UE5材质节点BumpOffset

BumpOffset 凹凸偏移&#xff0c;可以让材质显示视差偏移的效果 Coordinate是UV&#xff0c;Height是凹凸偏移高度&#xff0c;HeightRatioInput用来控制高度比

24.小R的随机播放顺序<字节青训营-中等题>

1.题目 问题描述 小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌&#xff0c;播放后将其从歌单中移除。如果歌单中还有歌曲&#xff0c;则会将当前第一首歌移到最后一首。这个过程会一直重复&#xff0c;直到歌单中没有任何歌曲。 例如&#xff0c;给定歌单 [5, …

ZCC40036 过压保护芯片

功能描述&#xff1a; ZCC40036 是一款过压保护电路&#xff0c;通常用在热插拔电源接口&#xff0c;当输入电压异常高压时关闭输出&#xff0c;保护后级电路免受高压侵害。特有的延时上电功能&#xff0c;还可用在热插拔防打火电路中&#xff0c;电源接通后 ZCC40036 延时。接…

仙盟系统开发——启动app失败

var 返回 仙盟使者.Cyber_CallApp(VOAPP, 命令, 携带);

LabVIEW声波谐振管自动化测量系统

开发了一种基于LabVIEW的声波谐振管自动化测量系统。该系统利用LabVIEW的强大功能&#xff0c;实现了对声波谐振频率的精确测量&#xff0c;提高了实验数据的采集效率和准确性。系统主要应用于物理教学和科研中&#xff0c;用于研究声波在谐振管中的传播特性。 项目背景 传统的…

word怎么添加链接,点击直接到参考文献

word怎么添加链接,点击直接到参考文献 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 在Word中添加点击可直接跳转到参考文献的链接,主要有以下两种方法: 使用交叉引用和超链接结合的方法 插入参考文献: 首先,在文档中需要插入参考…

UniApp 打开文件工具,获取文件类型,判断文件类型

注意&#xff1a;以下代码使用 typeScript 开发&#xff0c;如果想在 js 中使用&#xff0c;可参考 npm 已经发布的包&#xff1a;https://www.npmjs.com/package/uni-easy-file NPM 使用 如果想直接在 npm 项目中使用可以直接执行以下命令 npm i uni-easy-file然后直接使用 …

学习笔记:使用 pandas 和 Seaborn 绘制柱状图

学习笔记&#xff1a;使用 pandas 和 Seaborn 绘制柱状图 前言 今天在使用 pandas 对数据进行处理并在 Python 中绘制可视化图表时&#xff0c;遇到了一些关于字体设置和 Seaborn 主题覆盖的小问题。这里将学习到的方法和注意事项做个总结&#xff0c;以便之后的项目中可以快…

【2024年-8月-29日-开源社区openEuler实践记录】A - Ops:智能运维新时代的开源利器

开篇介绍 大家好&#xff0c;我是 fzr123&#xff0c;一直聚焦于前沿技术与开源项目&#xff0c;今天要给大家深度剖析一下A - Ops。在数字化转型加速的当下&#xff0c;运维工作愈发复杂艰巨&#xff0c;A - Ops 的出现&#xff0c;犹如一盏明灯&#xff0c;为运维人员照亮高…

【Linux】进程间通信-> 共享内存

共享内存原理 在C语言/C中&#xff0c;malloc也可以在物理内存申请空间&#xff0c;将申请的物理内存空间通过页表映射到进程地址空间&#xff0c;将内存空间的起始地址&#xff08;虚拟地址&#xff09;返回&#xff0c;进而进程可以使用虚拟地址通过页表映射到物理内存的方式…