• 使用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这才是最重要的,因为我们不可能只学习一门语言,一类只是,要把学到的只是形成体系,这样才是最应该的。

     
  • 相关阅读:
    C博客作业01分支、顺序结构
    C语言博客作业03函数
    AVR速度很快功能挺强
    盗取账户密码的代码,额,囧
    ANSI,ASCII,Unicode的区别与联系
    DIV特效汇
    IAR for AVR 学习笔记
    PLSQL Developer连接Oracle10g失败
    vs2008 framework 当前不会命中断点 还没有为该文档加载任何符号
    UDP协议
  • 原文地址:https://www.cnblogs.com/selfimprovement/p/5961206.html
Copyright © 2020-2023  润新知