使用django开发博客过程记录4——Category分类视图

在写点击博客的所属分类,显示所有该分类的文章时真是让我想了好一会,为什么呢?因为我使用的是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这才是最重要的,因为我们不可能只学习一门语言,一类只是,要把学到的只是形成体系,这样才是最应该的。

 
posted @ 2016-10-14 17:05  魔术师的礼帽  阅读(912)  评论(0编辑  收藏  举报