如何获得wagtaildjango的页面浏览量?

问题描述 投票:0回答:1

我打算在博客网站中创建一个页面,根据页面浏览量来安排和显示所有博客文章。不知道该如何实现。

模型.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"),
    ]
django wagtail
1个回答
1
投票

作为一个天真的解决方案,你可以添加一个字段。view_count 对你的 BlogPage 模型,这将是一个 IntegerField.

你将需要一种方法来更新这个值,每次页面被服务,你可以添加一些逻辑到 get_context 方法,您已经使用过。然而, serve 方法更合适,请务必检查服务是否被作为预览调用,通过检查 request.is_preview.

关于查询(按此排序) view_count),这可以通过更新查询来实现。

blogposts = self.get_siblings().live().public().order_by('-view_count')

你可以将这个新字段变成可见的,但不容易编辑(只在客户端验证),方法是通过添加一个 FieldPanel 随心所欲 widget. 使用Wagtail settings_panels 这可以在非内容面板中实现。

示例模型

models.py
from django.db import models
from django import forms

from wagtail.core.models import Page


class BlogPage(Page):
    # ... other fields

    view_count = models.IntegerField(blank=False, default=0)

    content_panels = Page.content_panels + [
        # ... existing content panels
    ]

    settings_panels = Page.settings_panels + [
        FieldPanel(
            'view_count',
            #  show the view count in the settings tab but do not allow it to be edited
            #  note: can be easily edited by savvy users, but only if they can also access admin
            widget=forms.NumberInput(attrs={'disabled': 'disabled', 'readonly': 'readonly'})
        )
    ]

请注意:本实施例不考虑任何其他情况,其中包括 serve 可能会被调用,但并不意味着 "一个独特的用户看到了我的博客文章"。你可能需要研究一个合适的Django分析解决方案,或者与客户端分析集成,比如Google Analytics或Heap。

© www.soinside.com 2019 - 2024. All rights reserved.