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

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 makemigrations
  • python 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:21:45