如何获取 wagtail/django 上的页面浏览量?

Her*_*roo 4 django wagtail

我计划在博客网站中创建一个页面,根据页面浏览量排列和显示所有博客文章。不知道如何实现它。

模型.py

class BlogPost(Page):
    date = models.DateField(verbose_name="Post date")
    categories = ParentalManyToManyField("blog.BlogCategory", blank=True)
    tags = ClusterTaggableManager(through="blog.BlogPageTag", blank=True)
    body = RichTextField(blank=False)

    main_image = models.ForeignKey(
        'wagtailimages.Image', 
        null=True,
        blank=False,
        on_delete=models.SET_NULL, 
        related_name='+')

    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        blogposts = self.get_siblings().live().public().order_by('-first_published_at')
        context['blogposts'] = blogposts
        return context

    content_panels = Page.content_panels + [
        FieldPanel('date'),
        FieldPanel('categories', widget=forms.CheckboxSelectMultiple),
        FieldPanel('tags'),
        ImageChooserPanel('main_image'),
        FieldPanel('body', classname="full"),
    ]
Run Code Online (Sandbox Code Playgroud)

joz*_*ozo 5

正如另一个答案中提到的,您可以将view_count字段添加到模型中。然后您可以利用 Wagtail 的钩子来增加数据库中的值。

模型中的新字段:

class BlogPage(Page):
    view_count = models.PositiveBigIntegerField(default=0, db_index=True)
Run Code Online (Sandbox Code Playgroud)

注册before_serve_page钩子:

@hooks.register("before_serve_page")
def increment_view_count(page, request, serve_args, serve_kwargs):
    if page.specific_class == BlogPost:
        BlogPost.objects.filter(pk=page.pk).update(view_count=F('view_count') + 1)
Run Code Online (Sandbox Code Playgroud)

在这种方法中,数据库负责正确递增view_count,因此您不必担心自己锁定和递增值。