from django.views.generic import ListView ListView 通过重写queryset, template_name和context_object_name来完成...ListView的自定义,还可以通过重写get_context_data方法传递额外的参数或内容。...显示 404) get_context_data() 可以添加额外的模板 context , 默认将 model / queryset 指定的 objects 添加到模板 context get_queryset...() 默认返回属性 queryset from django.views.generic import ListView class PublisherBookList(ListView):...template_name = 'books/books_by_publisher.html' def get_queryset(self): self.publisher =
分类页面的实现 考虑到分类页面是一个用来展示属于当前类别的所有文章,和首页一样的格式,就是显示的列表项十有八九会比首页少,因此分类页面的视图直接继承首页的视图,然后重写 get_queryset 方法就完事了...,代码如下: class CategoryView(IndexView): def get_queryset(self): return super().queryset.filter...get_queryset 方法就完事了,代码如下: class SearchView(IndexView): def get_queryset(self): keyword...'category_id'])).order_by( '-id') class SearchView(IndexView): def get_queryset(self...今天的内容基本上结束了,最后讲一下怎么安装配置 bootstrap。 ?
index.html" # 指定变量名称,保存查询到的数据 context_object_name = "question_list" # 列表页面,需要查询对应的数据集合 def get_queryset...内置类,通过template_name指定了HTML视图,通过context_object_name指定了保存数据的变量,在get_queryset()函数中定义了数据的查询方式 问题详细信息页面和问题解决方案的结果展示页面...视图对象的使用 经过上述的改造,我们可以看到视图处理函数已经变得非常的简洁,但是存在这样一个问题,IndexView处理类中的数据,我们可以看懂是通过get_queryset()函数进行查询的,然后自动复制给变量...def get_queryset(self): """ Return the list of items for this view....我们可以从上述代码中看到,继承自ListView视图处理类的类型,已经在内部封装好了分页操作功能,这也是我们项目中经常用到的技术呢,非常棒吧,我们继承了这个视图处理对象,就可以在后续的项目中,通过重写它的属性和方法来快捷的完成数据展示的分页功能了
方法: get_queryset():获取此视图的对象列表.必须是可迭代或者可以使查询集.默认返回queryset属性.可以通过重写该方法实现动态过滤.让这种方式能够工作的关键点,在于当类视图被调用时...,各种有用的对象被存储在self上,同request(self.request)一样,其中包含了从URLconf中获取到的位置参数(self.args)和关键字参数(self.kwargs)....方法: get_queryset():返回用来获取本视图显示对象的queryset.如果设置了queryset属性,get_queryset()默认返回它的值. get_object(queryset=...: context_object_name: pk_url_kwarg: 方法: get_queryset(): get_object(): form_valid(): get_context_data...(): get_queryset(): *get_context_data(**kwargs):* delete(request, args, **kwargs):*在获取到的对象上调用delete()
在本文中,我想谈谈优化Web项目代码的五种常用方法。虽然本文是以Django为例,但其他框架和语言的优化原则也是类似的。通过使用这些优化方法,文中例程的查询响应时间从原来的77秒减少到了3.7秒。...如果你想自己尝试着进行优化,可以在GitHub上获取优化前的初始代码,并跟着下文做相应的修改。我使用的是Python 2,因为一些第三方软件包还不支持Python 3。...但是,在序列化一个house实例时,HouseSerializer需要房子的country实例来计算序列化器的country字段。...为了提取所有需要的序列化数据,你可以在查询集上使用select_related()。...2.3 重构代码 到目前为止,我们已经改进了查询、用自己特定的函数取代了第三方复杂而又泛型的代码、更新了第三方包,但是我们还是保留了原有的代码。
/index.html' context_object_name = 'post_list' def get_queryset(self): cate = get_object_or..._404(Category, pk=self.kwargs.get('pk')) return super(CategoryView, self).get_queryset().filter...(category=cate) 和 IndexView 不同的地方是,我们覆写了父类的 get_queryset 方法。...然后我们调用父类的 get_queryset 方法获得全部文章列表,紧接着就对返回的结果调用了 filter 方法来筛选该分类下的全部文章并返回。...事实上,你可以简单地把 get 方法的调用看成是 detail 视图函数的调用。 接着我们又复写了 get_object 方法。
只是在字段上设置了一个值,表示数据已经被删除。 需要解决的问题 DRF 暴露DELETE方法一旦被执行,就需要操作软删除,把is_deleted字段设置为True。...class ModelManager(models.Manager): # 重写get_queryset方法 def get_queryset(self): # 查询出所有的数据...图片 所以下一步我们需要重写这个perform_destroy方法。...方法是执行获取查询的,那么把它重写了。...那……应该重写成什么?由于我们已经在模型层通过Manager直接改变了最初的数据过滤后的样子,这里怎么重写也是无事于补的。
这是通用视图在1.3发布中被重新设计的原因之一 - 之前,它们仅仅是一些函数视图加上 一列令人疑惑的选项;现在,比起传递大量的配置到URLconf中,更推荐的扩展通用视图的 方法是子类化它们,并且重写它们的属性或者方法...答案是派生DetailView,并且在get_context_data方法中提供你自己的实现。...相当方便的是, ListView 有一个get_queryset() 方法来供我们重写。在之前,它只是返回一个queryset属性值,但是现在我们可以添加更多的逻辑。...让这种方式能够工作的关键点,在于当类视图被调用时,各种有用的对象被存储在self上;同request()(self.request)一样,其中包含了从URLconf中获取到的位置参数 (self.args.../books_by_publisher.html' def get_queryset(self): self.publisher = get_object_or_404(Publisher
源码分析 GenericAPIView继承自APIView,也就是在APIView基础上再做了一层封装,源码如下: class GenericAPIView(views.APIView): queryset...如果没什么逻辑,可以直接写在视图的类属性中,如果逻辑比较复杂,也可以重写get_queryset方法用来返回一个queryset对象。...如果重写了get_queryset,那么以后获取queryset的时候就需要通过调用get_queryset方法。因为queryset 这个属性只会调用一次,以后所有的请求都是使用他的缓存。...也是可以通过直接设置这个属性,也可以通过重写get_serializer_class来实现。 lookup_field 在检索的时候,根据什么参数进行检索。默认是pk,也就是主键。...pagination_class 当分页列出结果时应使用的分页类。
上一节的注册中,使用了 form 表单,在 标签中,定义了 method 属性告诉浏览器想如何与服务器通信。...HTTP 规范定义了几种 request methods 请求方法,需要使用 GET 和 POST。...GET 用于从服务器请求数据,每当点击了一个链接或者直接在浏览器中输入一个网址时,就创建了一个 GET 请求。 POST 用于想更改服务器上的数据,每次发送数据给服务器都会导致资源状态变化。...基于类的通用视图 from django.views.generic import UpdateView, ListView ① 主页 class BoardListView(ListView):...kwargs): kwargs['board'] = self.board return super().get_context_data(**kwargs) def get_queryset
类进行修改 # 基本属性同 HomeView 相同,也可以直接继承 HomeView 然后复写 get_queryset() 方法实现 class CategoryView(ListView):...,通过复写该方法,改变默认行为 def get_queryset(self): # 类视图中,从 url 捕获的命名组参数值保存在实例的 kwargs 中,是一个字典...category = get_object_or_404(Category, pk=kwargs.get('pk')) return super(CategoryView, self).get_queryset...True print(page2.has_previous()) # 是否有上页 True print(page2.has_other_pages()) # 是否有其他页 True # 如果没有上/...1 print(page2.start_index()) # 当前页第一个 item 在列表中的位置 3 print(page2.end_index()) # 当前页最后一个 item 在列表中的位置
" def get_queryset(self): article_list = Article.objects.filter(status='p') for...): template_name = "blog/index.html" context_object_name = "article_list" def get_queryset...): template_name = "blog/index.html" context_object_name = "article_list" def get_queryset...,设置commit=False则先不保存到数据库, # 而是返回生成的comment实例,直到真正调用save方法时才保存到数据库。...,views.py中已经指定了context_object_name = "article_list",并且已经在get_queryset()中进行了markdown处理 {% for article
你可以通过重写 Manager.get_queryset() 的方法来覆盖 管理器自带的 查询集。get_queryset() 会根据你所需要的属性返回 查询集。...因此,要决定默认的管理器时,要小心谨慎,仔细考量,这样才能避免重写 get_queryset() 导致无法正确地获得数据。...如果你重写了 get_queryset() 方法并且过滤掉了一些行数据,Django 将返回不正确的结果。不要这么做!...在 get_queryset()方法中过滤掉数据,会使得它所在的管理器不适于用做自动管理器。...你也不应该在模型中使用这个属性之后,在类上改变它。这是因为在模型类被创建时,这个属性值马上就会被处理,而且随后不会再读取这个属性值。
在博客首页进行文章列表的显示。...1.首页指的是博客首页 /index/,首页分两栏,左边放文章列表,右边可根据个人喜好放一些标签、最新评论... 2.文章列表显示时进行分页,每页10篇文章,最多十页。...django.views.generic.list.ListView ListView 有以下方法: dispatch() http_method_not_allowed() get_template_names...() get_queryset() get_context_object_name() get_context_data() get() render_to_response() 修改 url 修改...blog/urls.py 文件: 在urls.py中使用类视图的时候都是调用它的 .as_view() 函数 ?
在Django中可以使用ListView来帮我们快速实现这种需求。...ArticleListView, self).get_context_data(**kwargs) print(context) return context def get_queryset...get_queryset:如果你提取数据的时候,并不是要把所有数据都返回,那么你可以重写这个方法。将一些不需要展示的数据给过滤掉。...3.2.2 Page常用属性和方法 has_next:是否还有下一页。 has_previous:是否还有上一页。 next_page_number:下一页的页码。...previous_page_number:上一页的页码。 number:当前页。 start_index:当前这一页的第一条数据的索引值。
列表视图与详情视图通用 queryset 应用于从此视图返回对象的查询集。通常,您必须设置此属性或覆盖该get_queryset()方法。...如果您要覆盖视图方法,请务必调用get_queryset()而不是直接访问此属性。 serializer_class 应该用于验证和反序列化输入以及序列化输出的序列化器类。...分页 以下属性用于在与列表视图一起使用时控制分页。 pagination_class 分页列表结果时应使用的分页类。...方法 列表视图与详情视图通用 get_queryset(self) 返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如: def get_queryset...详情视图使用 get_object(self) 返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在视图中可以调用该方法获取详情信息的模型类对象。
如果需要定制这些操作的行为,可以在视图集中重写对应的方法。...例如,在 BookViewSet 中,我们可以定制 create() 方法,以便在创建新书籍时自动将当前用户设置为书籍的作者:class BookViewSet(viewsets.ModelViewSet...() 方法,该方法会在创建新书籍时被调用。...= BookSerializer def get_queryset(self): user = self.request.user return Book.objects.filter...(author=user)在这个例子中,我们在 BookViewSet 中重写了 get_queryset() 方法,该方法会在获取书籍列表时被调用。
()方法来重写manager的基础Queryset.get_queryset()应该按照你的需求返回一个Queryset....由于get_queryset()返回一个Queryset对象,所以你可以使用filter(),exclude()和其他所有的Queryset方法....因为覆盖get_queryset()了,你可能接受到一个无用的返回对像,你必须避免这种情况. 2.自定义模型方法 为了给你的对像添加一个行级功能,那就定义一个自定义方法.鉴于manager经常被用来用一些整表操作...Obama' 3.重写预定义的模型方法 还有一组模型方法了封装了一些你可能想要自定义的数据库行为.特别是你可能想要修改save()和delete()的工作方式.你可以自由的重写这些方法(以及其他的模型方法...如果您在方法定义中使用了*args, **kwargs,您将保证您的代码在添加时将自动支持这些参数。