django.views.generic通用视图的CreateView, ListView, UpdateView, DetailView, DeleteView用法
导入:
from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView
入坑指南
用过django的人对视图函数并不陌生,generic 的通用视图用法很简单,所以在讲使用方法之前先讲几个个入坑指南吧。
坑1:这个坑主要在于参数“context_object_name",话不多说,直接入题:
在使用ListView和DeleteView的时候,如果你没有更改类视图中默认的context_object_name,一般不会出问题。但是如果更改了,请注意在不同的函数对应的模板中的参数使用。
在视图函数listView和list.html中传递的参数。
在视图函数deleteView和delete.html中传递的参数。
坑2:No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model.
原因:如果没有success_url
# 增加博客目录
class CheditorCategoryCreateView(LoginRequiredMixin, CreateView):model = ArticleCategorytemplate_name = 'cheditorBlog/category_create.html'fields = ['title']# 如果没有success_url,会报错No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model.success_url = reverse_lazy('blog:cheditorCategory_list')
使用详解
ListView
如果需要详细了解ListView的所有属性和方法,请参考:ListView -- Classy CBVhttp://ccbv.co.uk/projects/Django/2.2/django.views.generic.list/ListView/
ListView的使用方法其实很简单,基本只涉及三个文件:
views.py
from django.views.generic import ListViewclass NewsListView(LoginRequiredMixin, ListView):'''首页动态'''model = News# queryset = News.objects.all() # 默认为queryset= News.objects.all()paginate_by = 20 # 每页显示多少条,url中的?page=# page_kwarg = 'p' # 会用p代替page,一般不设置此参数context_object_name = "news_list" # 默认为‘模型类名_list’或‘object_list’ordering = ("-created_at",) # 可以有更多的排序规则template_name = 'news/news_list.html' # 默认为“模型类名小写_list.html”def get_ordering(self):# return super(NewsListView, self).get_ordering()passdef get_paginate_by(self, queryset):passdef get_queryset(self):return News.objects.filter(reply=False)# def get_context_data(self, *, object_list=None, **kwargs):# context = super(NewsListView, self).get_context_data()# context['views'] = 100# return context
urls.py文件
path('', views.NewsListView.as_view(), name='list'),
html文件
<a class="nav-link" href="{% url 'news:list' %}">简书</a>
DeleteView
如果需要详细了解DeleteView的所有属性和方法,请参考:DetailView -- Classy CBV DetailView in Django 2.2. Render a "detail" view of an object.By default this is a model instance looked up from `self.queryset`, but theview will support display of *any* object by overriding `self.get_object()`. http://ccbv.co.uk/projects/Django/2.2/django.views.generic.detail/DetailView/
DeleteView的使用方法其实很简单,基本只涉及三个文件:
views.py文件,注意常用属性和方法
# 删除动态# 本功能除了用户登录以及删除功能外,还要有一个关键步骤:验证动态的发表者 # class NewsDeleteView(LoginRequiredMixin, UserRequiredMixin, DeleteView): class NewsDeleteView(LoginRequiredMixin, DeleteView):model = Newstemplate_name = 'news/news_confirm_delete.html'# slug_url_kwarg = 'slug' # 通过url传入要删除对象的主键id,默认值是slug# pk_url_kwarg = 'pk' # 通过url传入要删除对象的主键id,默认值是pkmessage = '动态删除成功!'# success_url = reverse_lazy('news:list') # 在项目URLConf未加载使用# 替代UserRequiredMixin方法确保验证是否为原作者,用于状态删除、文章编辑;def get_object(self, queryset=None):object = super(NewsDeleteView, self).get_object(queryset=queryset)if object.user.username != self.request.user.username:# if object.user != self.request.user:raise PermissionDenied# raise Http404()return objectdef get_success_url(self):# 来源:from django.contrib import messagesmessages.success(self.request, self.message)return reverse_lazy('news:list')
urls.py文件,注意带参数pk
path("delete/<str:pk>", views.NewsDeleteView.as_view(), name="delete_news"),
htmls文件中的应用,注意带参数pk
<form method="post" action="{% url 'news:delete_news' news.pk %}">{% csrf_token %}<button class="btn btn-danger mr-5" type="submit">删除</button> </form>
django.views.generic通用视图的CreateView, ListView, UpdateView, DetailView, DeleteView用法相关推荐
- 深入Django(1): 通用视图 (generic views)
如果对Django的基础部分尚不熟悉,请参考<Django实战>系列. 内容提要 1. 回顾Django的视图函数(view function) 2. 在视图函数中使用模板 3. 简化视图 ...
- Django通用视图ListView、DetailView、BaseListView使用方法
DetailView django.views.generic.detail.DetailView 在执行此视图时,self.object将包含该视图所操作的对象. 该视图从以下视图继承方法和属性: ...
- django通用视图(CBV)
1. 介绍 Django提供了很多通用的基于类的视图(Class Based View),来帮我们简化视图的编写.这些View与上述操作的对应关系如下: 展示对象列表(比如所有用户,所有文章)- Li ...
- django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图
基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...
- Python Django CBV下的通用视图函数
ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request):retur ...
- Django 学习小组:基于类的通用视图详解(一)
通过三周的时间我们开发了一个简单的个人 Blog,教程地址: 第一周:Django 学习小组:博客开发实战第一周教程 -- 编写博客的 Model 和首页面 第二周:Django 学习小组:博客开发实 ...
- Django 基于类的通用视图详解
原文出处:https://segmentfault.com/a/1190000005685454 Django 学习小组:基于类的通用视图详解(一) 通过三周的时间我们开发了一个简单的个人 Blog, ...
- django通用视图(视图类)的login登陆、权限限定
django的登陆限定和权限限定是view设计中很重要的一个组成.网上的教程大部分都是通过使用view函数的装饰器来实现,比如: @login_required(login_url='/') @per ...
- Django 2.1.3 视图层 内置CBV通用视图
内置的基于类的通用视图 1. 扩展通用视图 2. 对象的通用视图 3. 制作"友好"的模板上下文 4. 添加额外的上下文 5. 查看对象的子集 6. 动态过滤 7. 执行额外的工作 ...
最新文章
- 跳跃游戏(判断是否可以跳到最后一个下标)
- 最近想问题想的睡不着,上来郁闷下!
- python 生成pdf收据_python如何与以太坊交互并将区块链信息写入SQLite
- DCMTK:读取DICOM图像,并使用设置创建PGM位图
- html5 居中 字体 字号,css字体水平居中
- JAVA系统和DOMINO通过LDAP集成方
- 《篡权的ss》-linux命令五分钟系列之三十一
- python requests返回值为200 但是text无内容_接口测试入门神器 - Requests
- 通俗易懂理解Attention机制
- Pytorch——计算机视觉工具包:torchvision
- 基于Java实现宠物领养救助交流平台设计和实现
- 处理不连续单元格,如sum,sumif,countif
- 下载igs对流层延迟(ZTD)产品
- P1548 [NOIP1997 普及组] 棋盘问题
- 你不知道的京东数据库运维自动化体系建设之路
- windows 7z命令行压缩
- @kubernetes(k8s) 应用配置管理(ConfigMap、subPath、Secret)
- ubuntu下无线网络网速缓慢问题解决
- 用Python写一个量化交易策略
- 20201113--工具总结