首页 > 编程视界 > Django

django中通用视图优点,基本用法以及获取url参数的方法

2022-08-09

本文网址:http://www.db800.cn/Django/3.html

所属分类:Django

简介描述: ListView
ListView用来获取指定的数据列表

下面建立了一个通用视图BookListView,用来显示已上架的图书列表,请注意:
urls.py中调用的是as_view()方法
默认模板为<app name>/<m

SEO标签: 暂无标签

购买此书

详情介绍

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 }}来访问传入的数据