ListView9UK读报网(DB800.cn)——分享我想分享的一切ListView用来获取指定的数据列表
9UK读报网(DB800.cn)——分享我想分享的一切9UK读报网(DB800.cn)——分享我想分享的一切下面建立了一个通用视图BookListView,用来显示已上架的图书列表,请注意:
9UK读报网(DB800.cn)——分享我想分享的一切urls.py中调用的是as_view()方法
9UK读报网(DB800.cn)——分享我想分享的一切默认模板为<app name>/<model name>_list.html,使用template_name来指定模板文件
9UK读报网(DB800.cn)——分享我想分享的一切查询获得的数据,传递给模板时所使用的变量名默认格式是<model name>_list,使用context_object_name可以指定变量名
# books/views.py9UK读报网(DB800.cn)——分享我想分享的一切
from django.views.generic import ListView9UK读报网(DB800.cn)——分享我想分享的一切
from .models import Book9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
class BookListView(ListView):9UK读报网(DB800.cn)——分享我想分享的一切
# 指定模型9UK读报网(DB800.cn)——分享我想分享的一切
model = Book9UK读报网(DB800.cn)——分享我想分享的一切
# 指定模板9UK读报网(DB800.cn)——分享我想分享的一切
template_name = 'books/book_list.html'9UK读报网(DB800.cn)——分享我想分享的一切
# 从模型中查询获得的数据,传递给模板时所使用的变量名9UK读报网(DB800.cn)——分享我想分享的一切
context_object_name = 'book_list'9UK读报网(DB800.cn)——分享我想分享的一切
# 添加逻辑条件9UK读报网(DB800.cn)——分享我想分享的一切
def get_queryset(self):9UK读报网(DB800.cn)——分享我想分享的一切
return Book.objects.filter(status='已上架')9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
# books/urls.py9UK读报网(DB800.cn)——分享我想分享的一切
from django.urls import path9UK读报网(DB800.cn)——分享我想分享的一切
from . import views9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
urlpatterns = [9UK读报网(DB800.cn)——分享我想分享的一切
path('book_list', views.BookListView.as_view())9UK读报网(DB800.cn)——分享我想分享的一切
]9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
若现在又有新的需求,要根据书名、作者或出版社来筛选图书,则可以建立个新类继承
BookListView
,重写逻辑条件,而无需重复指定模板。将来在显示图书列表时如有其他新的需求,同样如下操作,只需重写逻辑条件即可。
# books/views.py9UK读报网(DB800.cn)——分享我想分享的一切
class BookListView(ListView):9UK读报网(DB800.cn)——分享我想分享的一切
pass9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
class FilterBookListView(BookListView):9UK读报网(DB800.cn)——分享我想分享的一切
def get_queryset(self):9UK读报网(DB800.cn)——分享我想分享的一切
item_dict = {9UK读报网(DB800.cn)——分享我想分享的一切
'book': 'title',9UK读报网(DB800.cn)——分享我想分享的一切
'author': 'authors__name',9UK读报网(DB800.cn)——分享我想分享的一切
'publisher': 'publisher__name'9UK读报网(DB800.cn)——分享我想分享的一切
}9UK读报网(DB800.cn)——分享我想分享的一切
return Book.objects.filter(9UK读报网(DB800.cn)——分享我想分享的一切
**{item_dict[self.kwargs['item']]: self.kwargs['data']})9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
# books/urls.py9UK读报网(DB800.cn)——分享我想分享的一切
urlpatterns = [9UK读报网(DB800.cn)——分享我想分享的一切
path('book_list', views.BookListView.as_view()),9UK读报网(DB800.cn)——分享我想分享的一切
path('book_list/<str:item>/<str:data>', views.FilterBookListView.as_view()),9UK读报网(DB800.cn)——分享我想分享的一切
]9UK读报网(DB800.cn)——分享我想分享的一切
关于url传参: 这里的参数是写在URLconf里的,可以使用self.kwargs[]
来获取参数,如果是使用URL参数来传递,可以使用self.request.GET.dict()
获取。9UK读报网(DB800.cn)——分享我想分享的一切
DetailView
DetailView用来获取指定的单条数据
9UK读报网(DB800.cn)——分享我想分享的一切9UK读报网(DB800.cn)——分享我想分享的一切使用方法与ListView类似,但注意几点:
9UK读报网(DB800.cn)——分享我想分享的一切9UK读报网(DB800.cn)——分享我想分享的一切1、DetailView是根据模型中的主键进行数据选取,默认期望从URL中获取名为pk的主键值,因此URLconf里关于主键的格式应为<int:pk>,也可以使用pk_url_kwarg来指定主键名
9UK读报网(DB800.cn)——分享我想分享的一切2、查询获得的数据,传给模板时所使用的变量名默认就是模型名,可以使用context_object_name来指定变量名
# books/views.py9UK读报网(DB800.cn)——分享我想分享的一切
from django.views.generic import DetailView9UK读报网(DB800.cn)——分享我想分享的一切
class BookDetailView(DetailView):9UK读报网(DB800.cn)——分享我想分享的一切
model = Book9UK读报网(DB800.cn)——分享我想分享的一切
template_name = 'books/book_info.html'9UK读报网(DB800.cn)——分享我想分享的一切
# 指定主键名9UK读报网(DB800.cn)——分享我想分享的一切
pk_url_kwarg = 'id'9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
# books/urls.py9UK读报网(DB800.cn)——分享我想分享的一切
urlpatterns = [9UK读报网(DB800.cn)——分享我想分享的一切
path('book_info/<int:id>', views.BookDetailView.as_view())9UK读报网(DB800.cn)——分享我想分享的一切
]9UK读报网(DB800.cn)——分享我想分享的一切
9UK读报网(DB800.cn)——分享我想分享的一切
面并未指定
context_object_name
,因此在模板中使用默认变量名也就是模型名
{{ book }}
来访问传入的数据