Wagtail 按当前用户过滤外键

Wagtail Filter ForeignKey By Current User

我正在尝试为 Wagtail 中的教育培训应用构建进度跟踪器。我使用 PageModel 来表示“课程”:

# courses/models.py

class SectionLessonPage(Page):
    lesson_video = models.ForeignKey('wagtailvideos.Video',
                                     related_name='+',
                                     null=True,
                                     on_delete=models.SET_NULL)

    content_panels = Page.content_panels + [
        VideoChooserPanel('lesson_video'),
    ]

    def serve(self, request):
        if request.user.is_authenticated:
            lesson_viewed_signal.send(self.__class__, instance=self, request=request)
            return super().serve(request)

我有一个单独的 'progress' 应用程序,它从服务功能接收信号以记录特定用户的页面访问。

# progress/models.py

class UserLessonView(models.Model):
    lesson = models.ForeignKey(
        'courses.SectionLessonPage',
        null=True,
        blank=True,
        on_delete=models.CASCADE,
        related_name="views"
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    viewed_on = models.DateTimeField(auto_now_add=True)

这在两个模型之间建立了一对多的关系。但是,当我在模板中尝试为登录用户获取 SectionLessonPage 的 'views' 时,未考虑当前登录用户。

由于当前用户不是SectionLessonPage的字段,所以没有模型关系可以使用。相反,这可能需要在 SectionLessonPage 的 get_context() 或 serve() 方法中处理。

问题是当我在 SectionLessPage 模板上调用 {{ self.views }} 时,它 return 是所有用户的所有视图。 我需要它 return 仅针对当前用户的视图。如何传递此页面的视图,为当前用户过滤?

self.views.filter(user=request.user) 会做的。您不能在模板本身内调用 filter(因为 Django 模板语言不提供将参数传递给函数的方法),但您可以这样做 within the page's get_context method 以使该结果可用作模板中的变量:

class SectionLessonPage(Page):
    # ...
    def get_context(self, request):
        context = super().get_context(request)
        context['user_views'] = self.views.filter(user=request.user)
        return context

此结果将作为 {{ user_views }}.

在模板中提供