视图是Django最重要的模块之一,本文以每个类为一小节,以自己的理解简略介绍的重要API。
通用视图
View
方法
1.dispatch
2. http_method_not_allowed
3. options
属性
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
搞清楚后面这些http方法的用途?
类方法
as_view()
dispatch(request, *args, **kwargs)
就是一个分发方法,将不同的http方法请求分配给对应的方法,GET->get,POST->post
http_method_not_allowed(request, *args, **kwargs)
如果方法不被支持,就调用此方法,默认返回可以的方法列表
options(request, *args, **kwargs)
返回可以的方法列表
TemplateView
父类
TemplateResponseMixin
ContextMixin
View
方法
get_context_data()
使用方法:
调用父类方法;往context 里添加新内容;返回 context
def get_context_data(self, **kwargs):
context =super().get_context_data(**kwargs)
context['latest_articles'] = Article.objects.all()[:5]
return context
也可以给 as_view()
提供 extra_context
关键字参数
RedirectView
父类
View
方法
get_redirect_url()
属性
url
目标地址pattern_name
url 中的 namepermanent
True status code 301;False status code 302query_string
是否将GET查询字符串传递给新位置。 True则将查询字符串附加到URL。 False,则丢弃查询字符串。 默认为False。
query_string 不理解?
就是把从 原始url中捕获的参数,追加到新的url上。例如:article/1/ 转到 detail/1/; url = ‘detail’; query_string=True;
展示视图
DetailView
父类
SingleObjectTemplateResponseMixin
TemplateResponseMixin
BaseDetailView
SingleObjectMixin
View
方法
dispatch()http_method_not_allowed()- get_template_names()
- get_slug_field()
- get_queryset()
- get_object()
- get_context_object_name()
get_context_data()- get()
- render_to_response()
ListView
父类
MultipleObjectTemplateResponseMixin
TemplateResponseMixin
BaseListView
MultipleObjectMixin
View
方法
dispatch()http_method_not_allowed()- get_template_names()
- get_slug_field()
- get_queryset()
- get_object()
- get_context_object_name()
get_context_data()- get()
- render_to_response()
编辑视图
FormView
父类
TemplateResponseMixin
BaseFormView
FormMixin
ProcessFormView
View
方法
dispatch()http_method_not_allowed()- get_template_names()
- get_slug_field()
- get_queryset()
- get_object()
- get_context_object_name()
get_context_data()- get()
- render_to_response()
属性
template_name
form_class
success_url
CreateView
用来创建一个对象的视图,表单有误则显示错误,否则保存对象。
父类
SingleObjectTemplateResponseMixin
TemplateResponseMixin
BaseCreateView
ModelFormMixin
FormMixin
SingleObjectMixin
ProcessFormView
View
方法
dispatch()http_method_not_allowed()- get_template_names()
- get_slug_field()
- get_queryset()
- get_object()
- get_context_object_name()
get_context_data()- get()
- render_to_response()
属性
template_name_suffix 模板名称后缀
object
UpdateView
用来创建一个对象的视图,表单有误则显示错误,否则保存对象。
父类
SingleObjectTemplateResponseMixin
TemplateResponseMixin
BaseUpdateView
ModelFormMixin
FormMixin
SingleObjectMixin
ProcessFormView
View
方法
dispatch()http_method_not_allowed()- get_template_names()
- get_slug_field()
- get_queryset()
- get_object()
- get_context_object_name()
get_context_data()- get()
- render_to_response()
属性
template_name_suffix 模板名称后缀
object
fields 指名要更新的域
DeleteView
用来确定删除一个对象的视图,并且删除对象。仅当POST方法时删除,如果是GET,返回一个包含POST按钮的URL。
父类
SingleObjectTemplateResponseMixin
TemplateResponseMixin
BaseDeleteView
DeletionMixin
BaseDetailMixin
SingleObjectMixin
ProcessFormView
View
方法
dispatch()http_method_not_allowed()- get_template_names()
- get_slug_field()
- get_queryset()
- get_object()
- get_context_object_name()
get_context_data()- get()
- render_to_response()
属性
template_name_suffix 模板名称后缀
success_url 成功后跳转的地址
日期视图
ArchiveIndexView
父类
- MultipleObjectTemplateResponseMixin
- TemplateResponseMixin
- BaseArchiveIndexView
- BaseDateListView
- MultipleObjectMixin
- DateMixin
- View
属性
默认 object_name 为 lastest
默认 后缀 为 _archive
date_list 默认按 year
date_field 指定模型的日期字符串
YearArchiveView
父类
- MultipleObjectTemplateResponseMixin
- TemplateResponseMixin
- BaseYearArchiveView
- BaseDateListView
- MultipleObjectMixin
- YearMixin
- DateMixin
- View
属性
make_object_list 是否提供对象列表给context;默认False
get_make_object_list() 决定是否提供 object list 给context,make_object_list
allow_future 允许未来时间
allow_empty 允许为空
默认 object_name 为 lastest
默认 后缀 为 _archive
date_list 默认按 year
date_field 指定模型的日期字符串
Context 内容
- date_list 一个包含所有有对象的月份的查询集
- year 当前查询年份
- next_year 下一年第一天
- previous_year 前一年第一天
MonthArchiveView WeekArchiveView DayArchiveView TodayArchiveView 类似
DateDetailView 和日期绑定的对象视图,只显示该日这个对象的细节。
Mixin 混合基类
ContextMixin
上下文混合基
属性
extra_context 给 as_view 提供额外 context
TemplateView.as_view(extra_context={'title': 'Custom Title'})
方法
get_context_data(**kwargs) 处理 context 再返回
TemplateResponseMixin
模板响应混合基
属性
template_name 模板名
template_engine 模板引擎,没用过
response_class 默认是 TemplateResponse
content_type 响应类型 默认是 None 由 DEFAULT_CONTENT_TYPE 决定
方法
render_to_response(context, **response_kwargs) 返回一个 self.response_class 实例
get_template_names() 返回一个模板名列表,第一个被找到的会被使用
SingleObjectMixin
单例对象混合基
属性
model
对象的模型类
queryset
查询集 和 model 用一个就行
slug_field
模型中 slug-field 名字,默认slug一般不用;'s-l-u-g’像这种域就是slug
slug_url_kwarg
url 中 slug对象的关键字,默认slug即可;
pk_url_kwarg
中 pk的关键字,默认pk即可
context_object_name
指定用在 context 里的对象名
query_pk_and_slug
query_pk_and_slug
属性可以帮助缓解不安全的直接对象引用攻击。 当应用程序允许通过顺序主键访问各个对象时,攻击者可以强制猜测所有URL; 从而获得应用程序中所有对象的列表。 如果不希望有权访问单个对象的用户获取此列表,则将 query_pk_and_slug 设置为True将有助于防止猜测URL,因为每个URL都需要两个正确的非顺序参数。 简单地使用独特的slug可能会保持相同的目的,但是这种方案允许您拥有非独特的slug.
方法
get_object(queryset=None)
没有queryset,则用此方法 以pk_url_kwarg
查询对象;如果没有 pk_url_kwarg
,则用 slug_url_kwarg
参数查 slug_field
. 如果有 query_pk_and_slug=True
则同时按这两个参数找。
get_queryset()
重写此方法自定义查询集
get_context_object_name(obj)
获取上下文里对象的名字,默认是把模型名小写。Article -> article
get_context_data(**kwargs)
重写此方法自定义上下文
默认 object 和 context_object_name 两个对象。
get_slug_field()
默认返回 slug_field
SingleObjectTemplateResponseMixin
单例模板响应混合
属性和方法
template_name_field 模型里的模板名称域
template_name_suffix 模板名称后缀
get_template_names() 返回模板名列表,按下面顺序:
- template_name
- template_name_field
- <app_label>/<model_name><template_name_suffix>.html
MultipleObjectTemplateResponseMixin
多例模板响应混合基
同上
MultipleObjectMixin
多对象混合基,用来展示一个对象的列表
如何使用页数:
paginate_by
path('objects/page<int:page>/', PaginatedView.as_view()),
传入 page 参数
/objects/?page=3
page 可以用 last做参数
/objects/?page=last
属性和方法
allow_empty
允许为空model
queryset
是可变对象,使用时注意使用 all() 或者get_queryset()
使用副本ordering
等效于order_by()
paginate_by
一个整数,一页多少个paginate_orphans
分页孤儿,一个整数,防止最后一页数目太少page_kwarg
分页关键字 默认是page
paginator_class
分页器类 默认django.core.paginator.Paginator
context_object_name
get_queryset()
get_ordering()
get_paginate_by(queryset)
默认返回paginate_by
get_paginator(queryset, per_page, orphans=0, allow_empty_first_page=True)
默认返回 paginator_classget_paginate_orphans()
get_allow_empty()
get_context_object_name(object_list)
默认 Article -> article_listget_context_data(**kwargs)
paginate_queryset(queryset, page_size)
返回一个四元组(paginator, page, object_list, is_paginated)
Editing mixins 编辑混合基
- django.views.generic.edit.FormMixin
- django.views.generic.edit.ModelFormMixin
- django.views.generic.edit.ProcessFormView
- django.views.generic.edit.DeletionMixin
FormMixin
表单混合基
父级
ContextMixin
属性
initial
一个包含初始化数据的字典form_class
需要实例化的类 instantiatesuccess_url
表单处理成功重定向的地址prefix
生成表单的前缀
方法
get_initial()
get_form_class()
get_form(form_class=None)
实例化一个form_class
类的表单,使用get_form_kwargs()
的参数。如果没有form_class
则使用get_form_class()
get_form_kwargs()
获取表格初始化需要的数据get_prefix()
get_success_url()
form_valid(form)
重定向到get_success_url()
form_invalid(form)
响应上下文包含该formget_context_data(**kwargs)
调用get_form()
,在上下文里加一个{'form':form}
ModelFormMixin
父类
FormMixin
ingleObjectMixin
同上
ProcessFormView
提供基本的 GET POST 工作流
父类
View
属性方法
get(request, *args, **kwargs)
post(request, *args, **kwargs)
put(*args, **kwargs)
DeletionMixin
提供基本的 delete 工作流
属性方法
- success_url
- get_success_url()
Date-based mixins 日期混合基
YearMixin
属性方法
year_format
默认 ‘%Y’year
strget_year_format()
默认 year_formatget_year()
get_next_year(date)
get_previous_year(date)
MonthMixin
month_format
默认 ‘%b’
DayMixin
day_format
默认 ‘%d’
WeekMixin
week_format
默认 ‘%U’周日开始;‘%W’周一开始
DateMixin
所有时间相关行为的公共基
属性和方法
- date_field 指定模型中的日期域
- allow_future 允许未来日期
- get_date_field()
- get_allow_future()
BaseDateListView
父类
- DateMixin
- MultipleObjectMixin
属性方法
- allow_empty 默认 Fasle
- date_list_period 必须是 year month day 三者之一
- get_dated_items 返回一个三元组(date_list,object_list,extra_context)
- get_dated_queryset(**lookup) 返回查询集
- get_date_list_period()
- get_date_list(queryset, date_type=None, ordering=’ASC’) 返回具体哪些日期有条目