Django视图类
为Django内置的视图类,能极大简化开发流程,本文为学习官方文档时所做笔记,较为全面,方便复习和开发时迅速查询
基础视图
以下三个类视图提供了创建Django视图所需的大部分功能,可以将它们视为父视图,可以自己单独使用,也可以作为父视图被继承。它们可能不能提供项目所需的所有功能,在这种情况下,可以配合mixin和其他类视图一起使用
View
基础视图,根据请求方法进行处理
-
导入:
from django.views.generic.base import View -
属性
-
http_method_names(属性)可接受的HTTP方法名称列表 :['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
-
-
方法:
dispatch(request,*args,**kwargs)(方法):接受一个带参数的请求,并将请求分配给视图类中对应的方法中,默认情况下,HEAD请求将被委托给get()。如果需要以与GET不同的方式处理HEAD请求,可以重写HEAD()方法。http_method_not_allowed(*request*, **args*, **\*kwargs*)(方法):如果http方法是通过属性http_method_names规定以外的方法请求而来时调用此方法
TemplateView
返回模板和模板所需的上下文
-
导入
from django.views.generic.base import TemplateView -
继承自
django.views.generic.base.TemplateResponseMixindjango.views.generic.base.ContextMixindjango.views.generic.base.View
-
属性:
-
template_name:返回模板template_name='index.html'
-
-
方法:
get_context_data(self, **kwargs)::提供模板上下文内容并返回给对应的模板
-
示例:
from django.views.generic.base import TemplateView from articles.models import Article class HomePageView(TemplateView): template_name = "home.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['latest_articles'] = Article.objects.all()[:5] return context
RedirectView
重定向到指定的URL
-
导入
from django.views.generic.base import RediectView -
继承自:
django.views.generic.base.View
-
属性:
url:要重定向到的地址,字符串形式。如果为None则引发410错误响应pattern_name:要重定向到的URL地址的名称permanent:是否永久重定向,默认为Falsequery_string:是否将请求所带的查询字符串添加到响应的URL地址中,默认为False
-
方法:
get_redirect_url(*args,**kwargs):构建用于重定向的目标URL,args和kwargs参数分别是从请求URL中捕获的位置参数和/或关键字参数 。根据属性url或pettern_name来返回重定向的URL
-
示例:
from django.shortcuts import get_object_or_404 from django.views.generic.base import RedirectView from articles.models import Article class ArticleCounterRedirectView(RedirectView): permanent = False query_string = True pattern_name = 'article-detail' def get_redirect_url(self, *args, **kwargs): article = get_object_or_404(Article, pk=kwargs['pk']) article.update_counter() return super().get_redirect_url(*args, **kwargs)
通用显示视图
用于显示数据,是项目中最常用的视图类
DetailView
self.object包含视图正在操作的单个对象,本例中指的是Article对应的object
-
导入
from django.views.generic.detail import DetailView -
继承自
django.views.generic.detail.SingleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.detail.BaseDetailViewdjango.views.generic.detail.SingleObjectMixindjango.views.generic.base.View
-
方法
setupdispatchhttp_method_not_allowedget_template_names:返回一个列表,包含所有可用的模板的名称,默认使用第一个,如果指定了template_name属性则template_name一定在第一个get_slug_field():返回要查找的slug_field字段对应的值get_queryset()get_object()get_context_dataget_context_object_name():返回context_object_name设定的值,默认为objectgetrender_to_response()
-
示例
from django.utils import timezone from django.views.generic.detail import DetailView from articles.models import Article class ArticleDetailView(DetailView): model = Article context_object_name = 'article' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['now'] = timezone.now() return context模板中:
<h1>{{ article.headline }}</h1> <p>{{ article.content }}</p> <p>Reporter: {{ article.reporter }}</p> <p>Published: {{ article.pub_date|date }}</p> <p>Date: {{ now|date }}</p>ListView
ListView
这个视图执行时,self.object_list将包含视图操作的对象列表(通常为Queryset,但也不一定是)
-
导入
from django.views.generic.list import ListView -
继承自
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.list.BaseListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.base.View
-
属性:
-
context_object_name -
paginate_by:分页时每页所包含的数量paginate_by = settings.PAGINATE_BY #通常在settings中设置该属性
-
-
方法
setupdispatchhttp_method_not_allowedget_template_names:返回一个列表,包含所有可用的模板的名称,默认使用第一个,如果指定了template_name属性则template_name一定在第一个get_queryset()get_context_dataget_context_object_name():返回context_object_name设定的值,默认为objectgetrender_to_response()
-
示例:
from django.utils import timezone from django.views.generic.list import ListView from articles.models import Article class ArticleListView(ListView): model = Article paginate_by = 100 # if pagination is desired def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['now'] = timezone.now() return context模板中
<h1>Articles</h1> <ul> {% for article in object_list %} <li>{{ article.pub_date|date }} - {{ article.headline }}</li> {% empty %} <li>No articles yet.</li> {% endfor %} </ul>
通用编辑视图
对数据进行各种操作
FormView
显示表单,对表单数据进行验证,该类视图解决以下三种路径的表单请求:
- 初始GET(空或者预填充表单)
- 具有无效数据的POST(通常重新显示带有错误的表单)
- 具有有效数据的POST(处理数据并通常重定向)
-
导入
From django.views.generic.edit import FormView -
继承
django.views.generic.base.TemplateResponseMixindjango.views.generic.edit.BaseFormViewdjango.views.generic.edit.FormMixin:所有的表单的额外功能都来自该Mixin所以主要讨论该mixin所带来的方法属性initial:设置表单的初始值,字典形式form_class:将某个需要的表单实例化success_url:表单数据验证合法后跳转到的URLprefix:生成表单的前缀get_initial():检索initial,且可以给定一定逻辑,默认情况下返回initial值的副本get_form_class():检索form_class,且可以给定一定逻辑,默认情况下即为form_class的值get_form(form_class=None):使用get_form_kwargs()所给的参数实例化form_class所给的表单,如果form_class没有被设置,则使用get_form_class所给的值get_form_kwargs:设置创建实例化表单所需的关键字参数。get_success_url:确定表单成功验证时要重定向到的URL。默认情况下返回success_url。form_valid(form): 表单数据验证和验证成功后的行为,最终重定向到success_urlform_invalid(form):表单数据验证不成功后的行为,最终返回一个无效表单给上下文get_context_data
django.views.generic.edit.ProcessFormViewget(request,*args,**kwargs)post(request,*args,**kwargs)put(*args,**kwargs)
django.views.generic.base.View
-
示例
from myapp.forms import ContactForm from django.views.generic.edit import FormView class ContactView(FormView): template_name = 'contact.html' form_class = ContactForm success_url = '/thanks/' def form_valid(self, form): # This method is called when valid form data has been POSTed. # It should return an HttpResponse. form.send_email() return super().form_valid(form)模板中
<form method="post">{% csrf_token %} {{ form.as_p }} <input type="submit" value="Send message"> </form> -
业务逻辑请参考FormView
CreateView
可以用来创建某个对象的表单的视图 ,重新显示带有验证错误的表单(如果有),无错误则保存对象 .即可直接与模型进行交互
-
导入
from django.views.generic.edit import CreateView -
继承自
django.views.generic.detail.SingleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.edit.BaseCreateViewdjango.views.generic.edit.ModelFormMixin:该Mixin起主要作用,modelFroms类表单起主要作用model:指定要表单实例化的模型,否则将通过self.object或queryset来确定fields:用来展示的字段,注意不能和form_class一起使用,但必须和model一起使用success_urlget_form_class():默认情况下为form_class给定的值get_form_kwargs()get_success_url()form_valid(form)form_invalid(form)
django.views.generic.edit.FormMixindjango.views.generic.detail.SingleObjectMixindjango.views.generic.edit.ProcessFormViewdjango.views.generic.base.View
-
属性
template_name_suffix:可以设置模板后缀,通常配合get_template_name使用,在没有设置template_name时起很大作用,默认为全小写的模型名_formobject:被创建的对象,还未创建时为None
-
示例
from django.views.generic.edit import CreateView from myapp.models import Author class AuthorCreate(CreateView): model = Author fields = ['name']
UpdateView
一个用于编辑现有对象、重新显示带有验证错误的表单(如果存在验证错误)和保存对对象的更改的表单的视图。这将使用从对象的模型类自动生成的表单(除非手动指定了表单类)。
-
导入
from django.views.generic.edit import UpdateView -
继承自
django.views.generic.detail.SingleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.edit.BaseUpdateViewdjango.views.generic.edit.ModelFormMixindjango.views.generic.edit.FormMixindjango.views.generic.detail.SingleObjectMixindjango.views.generic.edit.ProcessFormViewdjango.views.generic.base.View
DeleteView
一个显示确认页或者删除现有对象的视图。只有当请求方法为POST时,才会删除给定的对象。如果这个视图是通过GET获取的,它将显示一个确认页面,其中应该包含一个发送到相同URL的表单。
- 继承自
django.views.generic.detail.SingleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.edit.BaseDeleteViewdjango.views.generic.edit.DeletionMixindjango.views.generic.detail.baseDetailViewsuccess_url:当删除成功后跳转的路径delete(request,*args,**kwargs):重写此方法,可以在删除的同时给与一定逻辑或其他功能get_success_url():返回指定对象已被成功删除时要重定向到的URL。默认情况下返回success_url。
django.views.generic.edit.SingleObjectMinxndjango.views.generic.base.View
通用日期视图
ArchiveIndexView
展示一个按日期显示最新对象到顶部的索引页 。带有未来日期的对象默认不会展示在索引页除非设置allow_future=True。
-
导入
import ArchiveIndexView -
继承自
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseArchiveIndexViewdjango.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixin:为所有基于日期的视图提供公共行为的mixin类date_field:根据模型中带有DateField或者DateTimeField的字段来决定对象索引页的展示顺序,注意如果开启了时区支持且选择了DateTimeField类型的字段则有可能带来时区问题导致每个不同时区的用户得到不同的排列结果,所以应该尽可能选择DateField类型的字段allow_futureget_date_field()get_allow_future()
django.views.generic.base.View
-
注意:
context将包含一个根据可用年份进行降序排列的QuerySet对象 ,表示为datetime.datetime对象,默认名为date_list- 默认使用
context_object_name将完整对象列表更改为latest - 默认
template_name_suffix:_archive - 默认根据年份排列,但也可以使用属性
date_list_period来改变为根据月份或天
-
示例:
from django.urls import path from django.views.generic.dates import ArchiveIndexView from myapp.models import Article urlpatterns = [ path('archive/', ArchiveIndexView.as_view(model=Article, date_field="pub_date"), name="article_archive"), ]模板中
<ul> {% for article in latest %} <li>{{ article.pub_date }}: {{ article.title }}</li> {% endfor %} </ul>
YearArchiveView
根据给定年份中中所有对象的可用月份进行归档的视图。带有未来日期的对象默认不会展示在索引页除非设置allow_future=True。
-
继承自
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseYearArchiveViewdjango.views.generic.dates.YearMixin:给日期的年份组件提供解析信息的Mixin类year_format:解析年份时所需的strftime()格式,默认情况下为%Yyear:选择一个年份,字符串形式,默认情况下为None,这意味着将通过其他方式确认年份get_year_format():默认情况下即返回year_format的值,可重写get_year():返回识图所选择的年份,字符串形式,将根据三个来源:year、URL pattern中捕获到的年份参数、GET方法查询字符串中所带的year关键字。若都没有找到则引起404错误get_next_year(date):返回一个date对象,该对象为给定年份后一年的第一天,并且将根据allow_empty和allow_future的值返回404错误或Noneget_previous_year(date):返回一个date对象,该对象为给定年份前一年的第一天,并且将根据allow_empty和allow_future的值返回404错误或None
django.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.views.generic.base.View
-
属性或方法
make_object_list:布尔值,将根据值来决定是否检索给定年的完整对象列表并将其传递给模板。若为True将把完整对象列表传递给模板上下文,若为False则会传递一个None。默认情况下,将为False的get_make_object_list:决定对象列表是否作为上下文的一部分返回。默认情况下返回make_object_listcontext:出来默认列表识图默认传递的上下文,还将包含:date_list:根据Queryset的所有可用月份进行升序排列的Queryset对象,表示为datetime.datetime对象Year:date对象,为给定的年份next_year:date对象,给定年份后一年的第一天previous_year:date对象,给定年份前一年的第一天
-
注意:
- 默认
template_name_suffix:_archive_year
- 默认
-
示例:
URL pattern:
from django.urls import path from myapp.views import ArticleYearArchiveView urlpatterns = [ path('<int:year>/', ArticleYearArchiveView.as_view(), name="article_year_archive"), ]视图中:
from django.views.generic.dates import YearArchiveView from myapp.models import Article class ArticleYearArchiveView(YearArchiveView): queryset = Article.objects.all() date_field = "pub_date" make_object_list = True allow_future = True模板中:注意·
date_list和object_list是两个完全不同的对象,object_list是根据make_object_list的值生成的完整对象列表,<ul> {% for date in date_list %} <li>{{ date|date }}</li> {% endfor %} </ul> <div> <h1>All Articles for {{ year|date:"Y" }}</h1> {% for obj in object_list %} <p> {{ obj.title }} - {{ obj.pub_date|date:"F j, Y" }} </p> {% endfor %} </div>
MonthArchiveView
显示给定月份中所有对象的月归档页面。 带有未来日期的对象默认不会展示在索引页除非设置allow_future=True。
-
继承自:
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseMonthArchiveViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.MonthMixin:给日期的年份组件提供解析信息的Mixin类month_format:%bmonthget_month_format()get_month()get_next_month(date):返回一个date对象,为后一个月份的第一天get_previous_month(date)
django.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.views.generic.base.View
-
context:除了BaseDateListView提供的常规上下文,还将有date_listmonthnext_monthprevious_month
-
注意:
- 默认
template_name_suffix:_archive_month
- 默认
-
示例:
URL pattern中
from django.urls import path from myapp.views import ArticleMonthArchiveView urlpatterns = [ # Example: /2012/08/ path('<int:year>/<int:month>/', ArticleMonthArchiveView.as_view(month_format='%m'), name="archive_month_numeric"), # Example: /2012/aug/ path('<int:year>/<str:month>/', ArticleMonthArchiveView.as_view(), name="archive_month"), ]视图中
from django.views.generic.dates import MonthArchiveView from myapp.models import Article class ArticleMonthArchiveView(MonthArchiveView): queryset = Article.objects.all() date_field = "pub_date" allow_future = True模板中
<ul> {% for article in object_list %} <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li> {% endfor %} </ul> <p> {% if previous_month %} Previous Month: {{ previous_month|date:"F Y" }} {% endif %} {% if next_month %} Next Month: {{ next_month|date:"F Y" }} {% endif %} </p>
WeekArchiveView
显示给定周中所有对象的归档页面。 带有未来日期的对象默认不会展示在索引页除非设置allow_future=True。
-
继承自:
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseWeekArchiveViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.WeekMixin:可用于检索和提供日期的星期解析组件mixin类week_format:默认为%U,这意味着一周从周日开始;如果从周一开始,请设置为%Wweekget_week_format()get_week()get_next_week(date):返回一个date对象,为后一个星期的第一天get_previous_week(date)
django.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.views.generic.base.View
-
context:除了BaseDateListView提供的常规上下文,还将有date_listweeknext_weekprevious_week
-
注意:
- 默认
template_name_suffix:_archive_week - 使用
date模板日期解析器输出的周数不总是和strftime()或strpttime()输出的周数相同,如2015年,前者就总是比后者解析出的周数多1,因此避免使用前者在模板中生成URL传递给WeekArchiveView
- 默认
-
示例:
URL pattern中:
from django.urls import path from myapp.views import ArticleWeekArchiveView urlpatterns = [ # Example: /2012/week/23/ path('<int:year>/week/<int:week>/', ArticleWeekArchiveView.as_view(), name="archive_week"), ]视图中:
from django.views.generic.dates import WeekArchiveView from myapp.models import Article class ArticleWeekArchiveView(WeekArchiveView): queryset = Article.objects.all() date_field = "pub_date" week_format = "%W" allow_future = True模板中:
<h1>Week {{ week|date:'W' }}</h1> <ul> {% for article in object_list %} <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li> {% endfor %} </ul> <p> {% if previous_week %} Previous Week: {{ previous_week|date:"W" }} of year {{ previous_week|date:"Y" }} {% endif %} {% if previous_week and next_week %}--{% endif %} {% if next_week %} Next week: {{ next_week|date:"W" }} of year {{ next_week|date:"Y" }} {% endif %} </p>
DayArchiveView
显示给定日中所有对象的日归档页面。 带有未来日期的对象默认不会展示在索引页除非设置allow_future=True,并且若设为False,不管将来是否有对象存在,都会抛出404错误。
-
继承自:
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseDayArchiveViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.MonthMixindjango.views.generic.dates.DayMixin:可用于检索和提供日期的日解析组件mixin类day_format:%ddayget_day_format()get_day()get_next_day(date):返回一个date对象,为后一天get_previous_day(date)
django.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.views.generic.base.View
-
context:除了BaseDateListView提供的常规上下文,还将有date_listdaynext_dayprevious_day
-
注意:
- 默认
template_name_suffix:_archive_day
- 默认
-
示例
URL pattern中:
from django.urls import path from myapp.views import ArticleDayArchiveView urlpatterns = [ # Example: /2012/nov/10/ path('<int:year>/<str:month>/<int:day>/', ArticleDayArchiveView.as_view(), name="archive_day"), ]视图中:
from django.views.generic.dates import DayArchiveView from myapp.models import Article class ArticleDayArchiveView(DayArchiveView): queryset = Article.objects.all() date_field = "pub_date" allow_future = True模板中
<h1>{{ day }}</h1> <ul> {% for article in object_list %} <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li> {% endfor %} </ul> <p> {% if previous_day %} Previous Day: {{ previous_day }} {% endif %} {% if previous_day and next_day %}--{% endif %} {% if next_day %} Next Day: {{ next_day }} {% endif %} </p>
TodayArchiveView
显示今天所有对象的日归档页面。本视图基本与DayArchiveView相同,除了用今天的日期代替了 year/month/day 参数.
-
继承自:
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseTodayArchiveViewdjango.views.generic.dates.BaseDayArchiveViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.MonthMixindjango.views.generic.dates.DayMixindjango.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.views.generic.base.View
-
注意:
- 默认
template_name_suffix:_archive_today
- 默认
-
示例
URL pattern中
from django.urls import path from myapp.views import ArticleTodayArchiveView urlpatterns = [ path('today/', ArticleTodayArchiveView.as_view(), name="archive_today"), ]视图中
from django.views.generic.dates import TodayArchiveView from myapp.models import Article class ArticleTodayArchiveView(TodayArchiveView): queryset = Article.objects.all() date_field = "pub_date" allow_future = True模板与
DayArchiveDay相同
DateDatailView
表示单个对象的视图类,如果该对象的日期位于将来将抛出404错误,除非设置allow_future=True
-
继承自:
django.views.generic.list.SingleObjectTemplateResponseMixin:与前面归档的视图类的不同django.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseDateDetailViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.MonthMixindjango.views.generic.dates.DayMixindjango.views.generic.dates.BaseDetailViewdjango.views.generic.list.SingleObjectMixindjango.views.generic.dates.DateMixindjango.views.generic.base.View
-
context中将包含model中的单个对象 -
注意:
- 默认
template_name_suffix:_detail
- 默认
-
示例:
URL pattern中
from django.urls import path from django.views.generic.dates import DateDetailView urlpatterns = [ path('<int:year>/<str:month>/<int:day>/<int:pk>/', DateDetailView.as_view(model=Article, date_field="pub_date"), name="archive_date_detail"), ]模板中
<h1>{{ object.title }}</h1>
比较
-
上面列出的所有通用视图都有匹配的
Base的基本视图,它们唯一的区别在于它们是否包括MultipleObjectTemplateResponseMixin类(用于归档视图)或SingleObjectTemplateResponseMixin(用于详细识图):BaseArchiveIndexViewBaseYearArchiveViewBaseMonthArchiveViewBaseWeekArchiveViewBaseDayArchiveViewBaseTodayArchiveViewBaseDateDetailView
BaseDateListView基础类详解
为所有基于日期的归档类视图提供公共行为的基类,上述日期类除了DateDatailView类都继承了此类。通常不会实例化BaseDateListView而是实例化其一个子类。
当这个视图(及其子类)执行时,self.object_list将包含视图正在操作的对象列表,self.date_list将包含数据可用的日期列表。一般配合·make_object_list一起使用 。
- 继承自:
DateMixinMultipleObjectMixin
- 方法和属性:
allow_empty:布尔值,指定在没有对象可用时是否显示页面。若为的且没有对象可用,视图将显示一个空页面,而不是引发404,默认为False。date_list_period:为date_list选择一个聚合期,字符串类型,必须为year/month/day中的一种date_list_items():返回一个包含(date_list、object_list、extra_context)的三元组,extra_context是一个上下文数据字典,它将被添加到MultipleObjectMixin提供的任何上下文数据中。get_dated_queryset(**lookup):返回一个queryset,使用lookup可利用自定义的查询参数进行二次筛选,可对queryset执行任何限制。get_date_list_period():返回date_list的聚合周期。默认情况下返回date_list_period的值。get_date_list(queryset,date_type=None,ordering='ASC'):返回queryset中date_type类型的可用的日期列表。比如get_date_list(qs,'year')将返回qs中以年份为聚合期的日期列表。如果date_type没有被提供,则使用get_date_list_period所设置的值。ordering可设置排序方式。最终date_type和ording都将被传递给QuerySet.dates()。

浙公网安备 33010602011771号