Django中如何统计存储用户登录次数并在管理面板展示
Django统计用户登录次数并展示在管理面板实现方案
以下按文件拆分说明每个位置需要写的代码,不需要额外引入第三方包:
models.py(存储登录次数字段)
不要直接修改Django内置的User表,用一对一关联的方式扩展字段:
from django.db import models from django.contrib.auth.models import User class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") login_count = models.IntegerField(default=0, verbose_name="累计登录次数") def __str__(self): return self.user.username
写完执行两条命令生成数据库表:
python manage.py makemigrationspython manage.py migrate
signals.py(登录触发计数逻辑)
利用Django内置的登录信号实现自动计数,不需要修改你现有的登录视图代码:
from django.contrib.auth.signals import user_logged_in from django.dispatch import receiver from .models import UserProfile @receiver(user_logged_in) def track_user_login(sender, request, user, **kwargs): # 用户首次登录没有对应profile时自动创建 user_profile, is_new = UserProfile.objects.get_or_create(user=user) user_profile.login_count += 1 user_profile.save(update_fields=["login_count"])
apps.py(加载信号,避免信号不生效)
很多人写完信号没反应是因为Django启动时没有加载信号文件,需要在对应app的配置类里添加ready方法:
from django.apps import AppConfig # 类名替换成你自己app对应的配置类名 class AccountConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "account" # 替换成你自己的app名称 def ready(self): # 导入写好的信号文件 import account.signals
注意:确保你的app在settings.py的INSTALLED_APPS里是用上面这个AppConfig类注册的,不要直接写app短名。
admin.py(将字段展示到管理面板)
把登录次数内嵌到默认的用户管理页面,不需要单独跳转查看:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.models import User from .models import UserProfile class UserProfileInline(admin.StackedInline): model = UserProfile can_delete = False verbose_name = "用户统计信息" class CustomUserAdmin(BaseUserAdmin): inlines = [UserProfileInline] # 可选:用户列表页直接展示登录次数,不用点进详情 list_display = ("username", "email", "is_staff", "show_login_count") def show_login_count(self, obj): return obj.profile.login_count show_login_count.short_description = "累计登录次数" # 注销默认的User管理配置,注册自定义配置 admin.site.unregister(User) admin.site.register(User, CustomUserAdmin)
如果你已经用AbstractUser自定义了用户模型,不需要建UserProfile一对一表,直接在自定义User模型里加
login_count = models.IntegerField(default=0)字段,信号里直接操作user.login_count +=1; user.save()即可,admin部分对应调整字段引用就行。
测试方法:退出admin账号后重复登录几次,再打开用户列表就能看到计数实时更新。
内容的提问来源于stack exchange,提问作者Harsh Goswami
相关产品推荐
相关产品推荐

