在写点击博客的所属分类,显示所有该分类的文章时真是让我想了好一会,为什么呢?因为我使用的是cbv模式开发的而不是简单的视图处理逻辑的,所以,有些操作会被包装好了,你并不知道它的细节,那么我们今天要实现的这个功能需要得到GET请求的category参数,那就麻烦了。
一开始,我以为需要重写它包装好的get()函数,结果弄了好一会后发现根本不好用。
后来,实在是没办法了,参照网上的说法,看了一看django源码,哇,效果果然显著,原来我们继承的ListView和MultipleObjectMixin类都继承自Context_Mixin类下面是它的代码:
class ContextMixin(object): """ A default context mixin that passes the keyword arguments received by get_context_data as the template context. """ def get_context_data(self, **kwargs): if 'view' not in kwargs: kwargs['view'] = self return kwargs
那么就好了,我们在get_queryset(self)中只需要获得kwargs['category']就可以了(看源码果然有好处啊)下面是代码:
class CategoryView(ListView, MultipleObjectMixin): template_name = 'apps/full-width.html' context_object_name = 'article_list' paginate_by = 10 def get_queryset(self): cat_query = Category.objects.get(name=self.kwargs['category']) article_list = cat_query.article_set.filter(status='p') return article_list
那个 MultipleObjectMixin是以为分页要用到需要继承的类。
在解决这个问题时还遇到另一个问题:
TypeError at /archive/category/Python/
object of type 'NoneType' has no len()
这是个什么问题呢?我们继承了MultipleObjectMixin类,它是负责处理分页的,但是我发现我的代码中没有return get_queryset()获得结果,所以该类无法获取读取信息的长度,所以会报这个错误。
这个问题让我意识到,学习不是去学习解决问题,而是去学习分析问题的过程,学习debug这才是最重要的,因为我们不可能只学习一门语言,一类只是,要把学到的只是形成体系,这样才是最应该的。