应用场景:博客首页展示帖子列表,同时,还需要展示帖子数量、当日新帖等信息。
问题: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。
博文总数: {{ num_posts }} | 今日更新:{{num_new_posts}} | 博客总数:{{ num_blogger }}
阅读原文:Django技巧:ListView中get_context_data的用法