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

如何筛选用户登录记录并获取特定已登录用户的登录信息?

实现Django用户登录记录的存储与筛选查看

要实现用户登录记录的筛选和特定用户登录信息查看,需要先添加登录日志的存储功能,再实现查询筛选逻辑,具体步骤如下:

1. 创建登录记录模型

在你的app的models.py中添加以下模型,用于存储登录日志:

from django.db import models
from django.contrib.auth.models import User

class LoginLog(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='login_logs')
    login_time = models.DateTimeField(auto_now_add=True)
    ip_address = models.GenericIPAddressField(null=True, blank=True)

    def __str__(self):
        return f"{self.user.username} - {self.login_time}"

执行数据库迁移命令,创建对应的数据表:

python manage.py makemigrations
python manage.py migrate

2. 修改登录视图,添加日志记录

更新appname/views.py中的user_login函数,在用户登录成功后写入日志:

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .models import LoginLog

def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip

def user_login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            # 记录登录日志
            ip = get_client_ip(request)
            LoginLog.objects.create(user=user, ip_address=ip)
            return redirect('home')  # Redirect to a success page
        else:
            return render(request, 'login.html', {'error_message': 'Invalid credentials'})

    return render(request, 'login.html')

3. 创建登录记录查看与筛选视图

在appname/views.py中添加以下视图,支持按用户名、日期范围筛选登录记录:

from django.shortcuts import render
from .models import LoginLog
from django.contrib.auth.decorators import login_required
from django.db.models import Q

@login_required
def login_logs(request):
    logs = LoginLog.objects.all().order_by('-login_time')
    
    # 处理筛选参数
    username = request.GET.get('username')
    start_date = request.GET.get('start_date')
    end_date = request.GET.get('end_date')
    
    if username:
        logs = logs.filter(user__username__icontains=username)
    if start_date:
        logs = logs.filter(login_time__date__gte=start_date)
    if end_date:
        logs = logs.filter(login_time__date__lte=end_date)
    
    context = {
        'logs': logs,
        'username': username,
        'start_date': start_date,
        'end_date': end_date
    }
    return render(request, 'login_logs.html', context)

4. 创建登录记录展示模板

在app的templates目录下创建login_logs.html:

<!DOCTYPE html>
<html>
<head>
    <title>登录记录</title>
    <style>
        table { border-collapse: collapse; width: 100%; margin-top: 20px; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
        .filter-form { margin-bottom: 20px; }
        .filter-form input { margin-right: 10px; padding: 5px; }
    </style>
</head>
<body>
    <h2>登录记录筛选与查看</h2>
    <div class="filter-form">
        <form method="get">
            <input type="text" name="username" placeholder="用户名" value="{{ username }}">
            <input type="date" name="start_date" value="{{ start_date }}">
            <input type="date" name="end_date" value="{{ end_date }}">
            <button type="submit">筛选</button>
        </form>
    </div>
    <table>
        <tr>
            <th>用户名</th>
            <th>登录时间</th>
            <th>IP地址</th>
        </tr>
        {% for log in logs %}
        <tr>
            <td>{{ log.user.username }}</td>
            <td>{{ log.login_time }}</td>
            <td>{{ log.ip_address }}</td>
        </tr>
        {% empty %}
        <tr>
            <td colspan="3">暂无登录记录</td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

5. 配置URL路由

在app的urls.py中添加对应路由:

from django.urls import path
from . import views

urlpatterns = [
    path('login/', views.user_login, name='login'),
    path('login-logs/', views.login_logs, name='login_logs'),
    # 其他路由...
]

完成以上步骤后,访问/login-logs/即可查看所有登录记录,并通过表单筛选特定用户或指定日期范围内的登录信息。

内容的提问来源于stack exchange,提问作者Sujata R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:25:29