Django 提供的 Generic Views
- Display Views: ListView, DetailView
- date-based Views: year/month/day achive page
- Edit Views: CreateView, UpdateView, DeleteView
Display Views
ListView
ListView
展示一系列对象(用于展示一个 Model 里面的所有对象,也可以是其子集 (queryset) ),支持分页
from django.views.generic import ListView
from books.models import Publisher
class PublisherList(ListView):
model = Publisher # 指明要操作的Model(展示 Publisher 的所有对象)
context_object_name = 'publisher_list' # 在模板 context 中 model 的变量名,默认是 object_list
template_name = 'app/publisher_list.html' # 要渲染的模板,默认是 '<app_name>/<model_name>_list.html'
其他重要属性:
context_object_name [get_context_object_name()]
extra_context
model
-
queryset
: 用来代替 model, 比如:Publisher.objects.all()[:10]
# 模板 context 中的变量名会有 object_list, <model_name>_list (publisher_list),拥有相同数据 -
ordering
: 一个字符串或数组,传给 queryset; 相当于:queryset.objects.order_by()
allow_empty
-
paginate_by [get_paginate_by()]
:每页的 object 的数量,页数用 request.GET (?page=1
) 或path('<int:page>\', PublisherList.as_view())
指明; (第一页是: ?page=1, 最后一页是:?page=last) -
paginate_orphans
:指明最后一页最多可以有几个 object (正常+溢出) template_name [get_template_names()]
-
template_name_suffix
:默认为'_list'
-
allow_empty
: 默认为 True (False 表示 object_list 为 空时,显示 404)
其他重要方法:[get(), head()]
-
get_context_data()
: 可以添加额外的模板 context , 默认将 model / queryset 指定的 objects 添加到模板 context -
get_queryset()
:默认返回属性 queryset
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super().get_context_data(**kwargs)
# Add in a QuerySet of all the books
context['book_list'] = Book.objects.all()
return context
使用方法的好处:self
中存储了许多有用的变量:self.request.user
, URLConf: self.args
, self.kwargs
class PublisherBookList(ListView):
template_name = 'books/books_by_publisher.html'
def get_queryset(self):
self.publisher = get_object_or_404(Publisher, name=self.kwargs['publisher']) # 根据链接提取除publisher
return Book.objects.filter(publisher=self.publisher) # 筛选出该出版社的所有书籍
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super().get_context_data(**kwargs)
# Add in the publisher
context['publisher'] = self.publisher # 将 publisher 添加到 模板 context
return context
Context:
-
object_list
和context_object_name
is_paginated
paginator
-
page_obj
: 该页包含的 objects
DetailView
DetailView
用于显示某一 Model 中的一个 object 的详细信息
- 和
ListView
一样,用属性model
或queryset
指定要操作的 Model 或 queryset -
DetailView
会根据 URLConf 中的<int:pk>
或<slug:slug>
筛选出一个 object
slug
默认只支持 ASCII 字符中的字母、数字、下划线、连字符
可以在 Model 设置SlugField.allow_unicode = True
, 使其支持 Unicode; 不过,还需要另外实现 <slug:slug> 中的转换器
重要属性:
context_object_name [get_context_object_name()]
extra_context
model
-
pk_url_kwarg
: 指定 URLConf 捕捉 pk 的变量名,默认使 'pk' (<int:pk>
) queryset [get_queryset()]
response_class [render_to_response()]
-
slug_field [get_slug_field()]
: 该 Model 中包含 slug 的项名,默认使slug
-
slug_url_kwarg
:默认是 'slug' (<slug:slug>
) template_name [get_template_names()]
template_name_suffix
重要方法:[.get(), .head()]
get_query()
get_context_data()
get_object()
# 当该页面被访问时,对 Model 做出额外的工作
class AuthorDetailView(DetailView):
queryset = Author.objects.all()
def get_object(self):
# get_object() 默认时返回通过 pk 或 slug 筛选出的对象(该视图需要操作的对象)
# Call the superclass
object = super().get_object()
# Record the last accessed date
object.last_accessed = timezone.now() # 当有人访问该页面时,更新最后访问时间
object.save()
# Return the object
return object