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

如何在Django的AbstractUser模型中添加用户最后登录时间字段?

在自定义AbstractUser模型中添加最后登录时间字段的实现方案

1. 扩展User模型,添加登录时间字段

在你的自定义User模型中新增last_app_login字段,用于记录用户最后一次登录应用的时间:

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils import timezone

class User(AbstractUser):
    is_buyer = models.BooleanField(default=False)
    is_merchant = models.BooleanField(default=False)

    pin = models.CharField(max_length=6, blank=True)
    TwoFA = models.BooleanField(default=False)
    image = models.ImageField(blank=True)

    date_created = models.DateTimeField(default=timezone.now)
    # 新增:记录最后一次应用登录时间
    last_app_login = models.DateTimeField(null=True, blank=True)

设置null=True, blank=True是因为用户首次登录前该字段无有效值,后续登录时再更新。

2. 实现登录时自动更新字段

有两种可靠方式触发字段更新:

方式一:利用Django内置登录信号

Django提供user_logged_in信号,用户登录成功后会自动触发,通过信号接收器更新字段:

  1. 在你的app目录下创建signals.py文件:
from django.contrib.auth.signals import user_logged_in
from django.dispatch import receiver
from django.utils import timezone

@receiver(user_logged_in)
def update_last_app_login(sender, user, request, **kwargs):
    user.last_app_login = timezone.now()
    # 仅更新指定字段,提升性能
    user.save(update_fields=['last_app_login'])
  1. 在app的apps.py中注册信号,确保Django启动时加载:
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = '你的app名称'

    def ready(self):
        import 你的app名称.signals
  1. 在settings.py的INSTALLED_APPS中替换原app名称为配置类路径:
INSTALLED_APPS = [
    # ... 其他应用
    '你的app名称.apps.YourAppConfig',
]

方式二:自定义登录视图中手动更新

如果使用自定义登录视图,可在验证成功后直接更新:

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from django.utils import timezone

def custom_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            # 更新登录时间
            user.last_app_login = timezone.now()
            user.save(update_fields=['last_app_login'])
            return redirect('首页路由名称')
        else:
            return render(request, 'login.html', {'error': '用户名或密码错误'})
    return render(request, 'login.html')

3. 同步数据库变更

添加字段后执行迁移命令,将模型变更同步到数据库:

python manage.py makemigrations
python manage.py migrate

内容的提问来源于stack exchange,提问作者static-man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:03:38