You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wagtail自定义用户跟踪异常:无法保存RestaurantPage访问记录

解决Wagtail中用户访问餐厅页面的追踪记录问题

嘿,作为Django和Wagtail新手,你这个思路其实没问题,但代码里有几个关键细节没处理对,导致追踪记录没存进数据库,咱们一步步来修正:

先说说你代码里的核心问题

  1. 错误的实例创建方式:你直接操作TrackUserRest类本身(还写错了模型类名,应该是TrackUserRestaurant),而不是创建它的实例。直接给类属性赋值根本不会生成数据库记录,只是修改了类的静态属性而已。
  2. save方法调用错误:track.save(self)是错的,模型实例的save()方法不需要传self参数,直接调用track.save()就行。
  3. 字段赋值逻辑问题:
    • 你给未登录用户设了track.user_id = 0,但模型里user_id允许为null,应该设为None更合理;
    • 模型的time字段用了auto_now=True,这会导致每次保存都更新时间,而你要的是用户首次访问的时间,应该用auto_now_add=True;
    • 你写的track.user = request.user.pk,但模型里的字段是user_id,直接赋值track.user_id = request.user.id才对。

修正后的完整代码

1. 先修正TrackUserRestaurant模型

class TrackUserRestaurant(models.Model):
    user_id = models.PositiveIntegerField(null=True)
    restaurant_id = models.PositiveIntegerField(blank=False, null=False)
    # 改成auto_now_add=True,只在创建记录时自动设置时间
    time = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('time', )

    def __str__(self):
        return 'Restaurant Tracking system: user.id({}) viewed rest.id({}) at timezone.({})'.format(self.user_id, self.restaurant_id, self.time)

2. 修正RestaurantPage的tracking方法

class RestaurantPage(Page):
    # 你的其他字段...
    view_count = models.PositiveIntegerField(default=0, editable=False)

    @property
    def restaurant_page(self):
        return self.get_parent().specific

    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        context['restaurant_page'] = self.restaurant_page
        context['restaurant'] = self
        self.tracking(request)
        return context

    def tracking(self, request):
        # 创建模型实例,类名必须和模型一致
        track = TrackUserRestaurant()
        track.restaurant_id = self.pk
        # 登录用户存id,未登录存None
        track.user_id = request.user.id if request.user.is_authenticated else None
        
        if request.user.is_authenticated:
            print('user id:' + str(request.user.id))
            print('rest id:' + str(self.pk))
        
        # 正确调用save方法,无需传参
        track.save()

最后要做的事

修改完代码后,记得运行以下命令更新数据库结构:

python manage.py makemigrations
python manage.py migrate

之后再访问RestaurantPage,就能在TrackUserRestaurant的数据库表(或admin后台)看到对应的访问记录啦~

内容的提问来源于stack exchange,提问作者LAM William

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:37:57