Python 监视Django中的用户活动

Python 监视Django中的用户活动,python,django,Python,Django,我正在创建一个图书应用程序,用户可以在其中注册并开始阅读 这是本书的model.py: from django.db import models from django.urls import reverse from django.conf import settings class Chapter(models.Model): title = models.CharField(max_length=200, unique=True) slug = models.Slug

我正在创建一个图书应用程序,用户可以在其中注册并开始阅读

这是本书的model.py:

from django.db import models
from django.urls import reverse

from django.conf import settings


class Chapter(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(unique=True)
    date_completed = models.DateTimeField(blank=True, null=True)

    completed = models.BooleanField(default=False)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("course:subchapter_list", kwargs={"pk": self.pk})


class SubChapter(models.Model):
    chapter = models.ForeignKey(Chapter, on_delete=models.CASCADE)
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(unique=True)

    completed = models.BooleanField(default=False)

    def __str__(self):
        return self.title


class SubSection(models.Model):
    sub_chapter = models.ForeignKey(SubChapter, on_delete=models.CASCADE)
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(unique=True)
    text = models.TextField(null=True, blank=False)

    completed = models.BooleanField(default=False)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("course:detail",
                       kwargs={"slug": self.sub_chapter.slug,
                               "slug2": self.slug,
                               "pk": self.sub_chapter.chapter.pk,
                               }
                       )
如何监控每个用户的进度,以便在查看/读取小节/子章节/章节时,仅针对该用户将该模型实例的completed属性设置为True?我当前的实现为每个人都设置为“已完成”


如果您想监控每个用户的阅读进度,您不能在
章节
子章节
子章节
模型上有完整的字段,您需要一个与用户相关的新字段。我会这样做:

class ReadingProgress(models.Model):
    user = models.ForeignKey(User)
    completed_chapter = models.ForeignKey(Chapter)
    completed_subchapter = models.ForeignKey(SubChapter)
    completed_subsection = models.ForeignKey(SubSection)
如果您有不同的书籍,还应该向书籍模型添加外键


然后,在获取章节等的视图中,您可以获取特定用户(和书籍?)的
ReadingProgress
对象,并设置相应的值。

您可能希望在视图中执行此操作,因为这是由一个特定用户对一个模型实例的GET请求来完成的。你可能想考虑制作基类,因为我怀疑你的三个类之间有很多共同点,包括你问的逻辑。你可能也想读一下Django的部分,但这可能不是有用的;它还可能混淆某些逻辑。首先看看您是否可以在特定视图的get请求中处理这个问题。也许您可以创建一个中间件,编写一些代码来检测用户是否进入/退出一个小节/子章节/章节并更新模型。我尝试了这两种方法(视图/中间件),但都遇到了很多挫折。我会很感激你能处理这些挑战。谢谢,这是有效的,但在我的例子中,这对程序员来说是一种负担,因为它必须在每一个视图中完成,在每一个跟踪的活动中完成。我有一个类似的OP的需求,但它是相当大的一点,我已经有大约100个意见,我们仍然在开发的初始阶段。我可以通过在每个视图中手动保存用户信息来存储用户活动,但这仍然有点糟糕。在我不必手动输入与用户活动相关的必需数据的项目视图中,是否有Django方法可以跟踪用户导航?