如果您想基于仅在子类中找到的属性进行任何过滤,self.get_siblings() 将失败,因为 PageQuerySet 结果是 Page 类型。
对我来说,我有一个可以按类别或标签过滤的博客索引页面。沼泽详情页面的末尾有下一篇和上一篇博文的卡片。我希望那些上一个/下一个帖子根据我登陆该页面的过滤器。
为了解决这个问题,您需要查询属于子类的对象(例如 BlogDetailPage),过滤这些对象,然后使用class.objects.sibling_of(self)获取上一篇/下一篇文章:
def get_context(self, request, *args, **kwargs):
context = super().get_context(request, *args, **kwargs)
siblings = self.__class__.objects.sibling_of(self).live()
category_filter = request.GET.get("category", None)
tag_filter = request.GET.get("tag", None)
if category_filter:
siblings = siblings.filter(categories__slug__in=category_filter.split(","))
context["filter"] = '?category=' + category_filter
elif tag_filter:
siblings = siblings.filter(tags__slug__in=tag_filter.split(','))
context["filter"] = '?tag=' + tag_filter
else:
context["filter"] = ''
context["next_post"] = siblings.filter(path__gt=self.path).first()
context["previous_post"] = siblings.filter(path__lt=self.path).first()
return context
我使用self.__class__.objects.sibling_of(self)
它是在一个带有子类博客页面的超类中。