我计划在博客网站中创建一个页面,根据页面浏览量排列和显示所有博客文章。不知道如何实现它。
模型.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)
正如另一个答案中提到的,您可以将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,因此您不必担心自己锁定和递增值。
| 归档时间: |
|
| 查看次数: |
1532 次 |
| 最近记录: |