如何在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信号,用户登录成功后会自动触发,通过信号接收器更新字段:
- 在你的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'])
- 在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
- 在
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
相关产品推荐
相关产品推荐

