如何筛选用户登录记录并获取特定已登录用户的登录信息?
实现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
相关产品推荐
相关产品推荐

