应用场景:博客首页展示帖子列表,同时,还需要展示帖子数量、当日新帖等信息。
问题:ListView默认返回“帖子”模型的列表,但是,怎么附带帖子的总数呢?
解决方案:重载get_context_data方法,将帖子总数,今日新帖总数等信息加到context字典中。

# views.py
class IndexListView(ListView):
    model = BlogPost
    paginate_by = 50
    context_object_name = 'posts'
    template_name = 'blog/index.html'

    # 展示 available为 True的内容。
    def get_queryset(self):
        return BlogPost.objects.filter(available=True)

    # 注意,只有**kargs参数。
    def get_context_data(self, **kargs):
    # 很关键,必须把原方法的结果拿到
        context = super().get_context_data(**kargs)
        # 帖子总数
        num_posts = self.get_queryset().count()
        # 今日帖子数
        num_new_posts = self.get_queryset().filter(pub_date__gte=datetime.datetime.now().date()).count()
    # 博客数
        num_blogger = UserProfile.objects.filter(nickname__isnull=False).count()
        context['num_posts'] = num_posts
        context['num_new_posts'] = num_new_posts
        context['num_blogger'] = num_blogger
        # 很重要,返回用来渲染模板的上下文,里面除了默认的posts,还有附加信息。
        return context

在模板index.html中,直接使用get_context_data方法中加入的context。

<p class="count">博文总数: {{ num_posts }} | 今日更新:{{num_new_posts}} | 博客总数:{{ num_blogger }}</p>

Leave a Reply

Your email address will not be published. Required fields are marked *