在 Django 中显示加入日期和 last_login
Display join date and last_login in Django
我有用户默认的 Django 用户模型来注册用户。我想在模板上打印用户 last_login 和 join_date。而且我还想检查用户是否活跃。
我想像这样检查用户活动状态,如果用户当前正在使用我的网站,则状态应为“活动”如果用户已注销,则状态应为“已注销”
如果可能,请也为我提供解决方案
accounts/models.py
class Profile(models.Model):
user = models.OneToOneField(User, default="1", on_delete=models.CASCADE)
image = models.ImageField(upload_to="images/", default="default/user.png")
def __str__(self):
return f'{self.user} profile'
dashboard/views.py(显示用户数据)
def admin_home(request):
data = Profile.objects.filter(Q(user__is_superuser=False), Q(
user__is_staff=False)).order_by('-user__last_login')[:10]
context = {
'data': data,
}
return render(request, "instructor/admin_home.html", context)
Accounts/urls.py
from django.contrib import admin
from . import views
from django.contrib.auth import views as auth_views
from django.urls import path
app_name="accounts"
urlpatterns=[
path('register',views.register,name="register"),
path('admin_login',views.admin_login,name="admin_login"),
path('user_login',views.user_login,name="user_login"),
path('admin_editprofile',views.admin_editprofile, name="admin_editprofile"),
path('user_editprofile',views.user_editprofile, name="user_editprofile"),
path('admin_profile',views.admin_profile, name="admin_profile"),
path('user_profile',views.user_profile, name="user_profile"),
path('Logout',views.Logout, name="Logout"),
path('user_chage_password' , views.user_chage_password , name="user_chage_password"),
path('admin_change_password',views.admin_change_password,name="admin_change_password"),
]
额外我有两个应用程序,一个是仪表板和其他帐户。在帐户应用程序中,我仅实现帐户的相关 URL,而在仪表板应用程序中,我将其用于其他用途。
对于用户注册,我使用 Django 的默认 User
模型。
show_all_users.html 或模板文件(用于显示用户数据)
<html lang="en" class="no-focus">
<head>
{% load static %}
<link rel="stylesheet" href="{% static 'js/plugins/datatables/dataTables.bootstrap4.min.css' %}">
<link rel="stylesheet" id="css-main" href="{% static 'css1/codebase.min.css' %}">
</head>
<body>
<div id="page-container" class="sidebar-o sidebar-inverse side-scroll page-header-fixed main-content-narrow">
{% include "instructor/sidebar.html" %}
{% include "instructor/admin_nav.html" %}
<!-- Main Container -->
<main id="main-container" style="background-color:white;">
<!-- Page Content -->
<div class="content">
<div class=" container mt-5" style=" position: absolute; margin-left:-4%;">
<div>
<h1 class="text-success text-center"></h1>
<h4 class="text-center text-danger">Recently Logged in users</h4>
<table id="datatable" class="table table-striped table-bordered" style="width:100% color:gray;" >
<thead style="background-color : #607d8b;">
<tr>
<th scope="col">ID</th>
<th scope="col">Profile</th><th scope="col">Username</th>
<th scope="col">Last_login</th>
<th scope="col">join_date</th>
<th scope="col">Action</th>
</tr></thead>
<tbody>
{% for userData in data %}
<tr>
<th scope="row">{{userData.id}}</th>
<td><img style="width: 40px; border-radius:15px;" src="{{userData.image.url}}" alt="this is it."></td>
<td>{{userData.user.username}}</td>
<td> {{request.user.profile.date_joined }}</td>
<td>{{ request.user.profile.last_login }} </td>
<td>
<a href="{% url 'dashboard:delete_user' userData.id %}"> <button class="btn btn-danger btn-sm" onclick="window.mytest()">Delete</button></a>
<script type="text/javascript">window.mytest = function() { var isValid = confirm('Are you sure to Delete this user?');
if (!isValid) { event.preventDefault(); alert("It wont delete. Yay!");}}</script>
</td>
</tr>
{% endfor %} </tbody></table></div>
</div>
</main>
{% endblock body %}
但是此 <td> {{request.user.profile.date_joined }}</td>
行打印当前登录用户的登录日期,但我想显示所有用户的 last_login
日期。
并且这一 <td>{{ request.user.profile.last_login }} </td>
行不打印任何内容。
创建 signals.py
并添加此代码段:
from django.contrib.auth.signals import user_logged_in,user_logged_out
from datetime import datetime
@receiver(user_logged_in)
def user_logged(sender,request,user,**kwargs):
user.profile.last_login = datetime.now()
user.profile.save()
将 related_name
属性添加到 个人资料 模型下方的用户字段:
class Profile(models.Model):
user = models.OneToOneField(User,default="1", on_delete=models.CASCADE, related_name="profile")
image = models.ImageField(upload_to="images",default="default/user.png")
date_joined = models.DateTimeField()
def save(self, *args, **kwargs) -> None:
self.date_joined = datetime.now()
return super().save(*args, **kwargs)
def __str__(self):
return f'{self.user} profile'
运行 在终端上:
python manage.py makemigrations
python manage.py migrate
问题:
只有last_login
和date_joined
是django默认User
模型中的有效字段。
不要使用 request.user.....
,因为它会打印当前登录用户的详细信息,正如您所说我希望它显示给所有用户。
Question 1:
But this <td> {{request.user.profile.date_joined }}</td>
line prints login date of currently logged in user but I want to show all user's last_login date.
Answer:
This is because request...
give you current logged in user's details not all users' details.
Question 2:
And this <td>{{ request.user.profile.last_login }} </td>
line prints nothing.
Answer:
It is because, there is wrong relationship of models.
解决方案:
在模板文件中尝试以下代码以显示所有用户:
<td> {{userData.user.last_login }}</td>
<td>{{ userData.user.date_joined }} </td>
您试过以下代码:
<td> {{request.user.profile.date_joined }}</td>
<td>{{ request.user.profile.last_login }} </td>
Remember:
Here, you have filtered only those users which are not staff as well as superuser, so these users are normal users. And if last_login
column prints None
that means the user has not logged even single time. And for date_joined
,by default current time is taken by django. And if you see another time than your local machine that means you haven't set time zone in TIME_ZONE
in settings.py
. The timezone for India is Asia/kolkata
, for more info refer Time zones
[django-doc].
您可以通过Q(user__last_login__isnull=False)
过滤至少登录过一次的用户。
在视图中尝试此查询:
views.py
def admin_home(request):
data = Profile.objects.filter(Q(user__is_superuser=False), Q(
user__is_staff=False), Q(user__last_login__isnull=False)).order_by('-user__last_login')[:10]
context = {
'data': data,
}
return render(request, "instructor/admin_home.html", context)
我有用户默认的 Django 用户模型来注册用户。我想在模板上打印用户 last_login 和 join_date。而且我还想检查用户是否活跃。
我想像这样检查用户活动状态,如果用户当前正在使用我的网站,则状态应为“活动”如果用户已注销,则状态应为“已注销” 如果可能,请也为我提供解决方案
accounts/models.py
class Profile(models.Model):
user = models.OneToOneField(User, default="1", on_delete=models.CASCADE)
image = models.ImageField(upload_to="images/", default="default/user.png")
def __str__(self):
return f'{self.user} profile'
dashboard/views.py(显示用户数据)
def admin_home(request):
data = Profile.objects.filter(Q(user__is_superuser=False), Q(
user__is_staff=False)).order_by('-user__last_login')[:10]
context = {
'data': data,
}
return render(request, "instructor/admin_home.html", context)
Accounts/urls.py
from django.contrib import admin
from . import views
from django.contrib.auth import views as auth_views
from django.urls import path
app_name="accounts"
urlpatterns=[
path('register',views.register,name="register"),
path('admin_login',views.admin_login,name="admin_login"),
path('user_login',views.user_login,name="user_login"),
path('admin_editprofile',views.admin_editprofile, name="admin_editprofile"),
path('user_editprofile',views.user_editprofile, name="user_editprofile"),
path('admin_profile',views.admin_profile, name="admin_profile"),
path('user_profile',views.user_profile, name="user_profile"),
path('Logout',views.Logout, name="Logout"),
path('user_chage_password' , views.user_chage_password , name="user_chage_password"),
path('admin_change_password',views.admin_change_password,name="admin_change_password"),
]
额外我有两个应用程序,一个是仪表板和其他帐户。在帐户应用程序中,我仅实现帐户的相关 URL,而在仪表板应用程序中,我将其用于其他用途。
对于用户注册,我使用 Django 的默认 User
模型。
show_all_users.html 或模板文件(用于显示用户数据)
<html lang="en" class="no-focus">
<head>
{% load static %}
<link rel="stylesheet" href="{% static 'js/plugins/datatables/dataTables.bootstrap4.min.css' %}">
<link rel="stylesheet" id="css-main" href="{% static 'css1/codebase.min.css' %}">
</head>
<body>
<div id="page-container" class="sidebar-o sidebar-inverse side-scroll page-header-fixed main-content-narrow">
{% include "instructor/sidebar.html" %}
{% include "instructor/admin_nav.html" %}
<!-- Main Container -->
<main id="main-container" style="background-color:white;">
<!-- Page Content -->
<div class="content">
<div class=" container mt-5" style=" position: absolute; margin-left:-4%;">
<div>
<h1 class="text-success text-center"></h1>
<h4 class="text-center text-danger">Recently Logged in users</h4>
<table id="datatable" class="table table-striped table-bordered" style="width:100% color:gray;" >
<thead style="background-color : #607d8b;">
<tr>
<th scope="col">ID</th>
<th scope="col">Profile</th><th scope="col">Username</th>
<th scope="col">Last_login</th>
<th scope="col">join_date</th>
<th scope="col">Action</th>
</tr></thead>
<tbody>
{% for userData in data %}
<tr>
<th scope="row">{{userData.id}}</th>
<td><img style="width: 40px; border-radius:15px;" src="{{userData.image.url}}" alt="this is it."></td>
<td>{{userData.user.username}}</td>
<td> {{request.user.profile.date_joined }}</td>
<td>{{ request.user.profile.last_login }} </td>
<td>
<a href="{% url 'dashboard:delete_user' userData.id %}"> <button class="btn btn-danger btn-sm" onclick="window.mytest()">Delete</button></a>
<script type="text/javascript">window.mytest = function() { var isValid = confirm('Are you sure to Delete this user?');
if (!isValid) { event.preventDefault(); alert("It wont delete. Yay!");}}</script>
</td>
</tr>
{% endfor %} </tbody></table></div>
</div>
</main>
{% endblock body %}
但是此 <td> {{request.user.profile.date_joined }}</td>
行打印当前登录用户的登录日期,但我想显示所有用户的 last_login
日期。
并且这一 <td>{{ request.user.profile.last_login }} </td>
行不打印任何内容。
创建 signals.py
并添加此代码段:
from django.contrib.auth.signals import user_logged_in,user_logged_out
from datetime import datetime
@receiver(user_logged_in)
def user_logged(sender,request,user,**kwargs):
user.profile.last_login = datetime.now()
user.profile.save()
将 related_name
属性添加到 个人资料 模型下方的用户字段:
class Profile(models.Model):
user = models.OneToOneField(User,default="1", on_delete=models.CASCADE, related_name="profile")
image = models.ImageField(upload_to="images",default="default/user.png")
date_joined = models.DateTimeField()
def save(self, *args, **kwargs) -> None:
self.date_joined = datetime.now()
return super().save(*args, **kwargs)
def __str__(self):
return f'{self.user} profile'
运行 在终端上:
python manage.py makemigrations
python manage.py migrate
问题:
只有last_login
和date_joined
是django默认User
模型中的有效字段。
不要使用 request.user.....
,因为它会打印当前登录用户的详细信息,正如您所说我希望它显示给所有用户。
Question 1:
But this<td> {{request.user.profile.date_joined }}</td>
line prints login date of currently logged in user but I want to show all user's last_login date.
Answer:
This is becauserequest...
give you current logged in user's details not all users' details.
Question 2:
And this<td>{{ request.user.profile.last_login }} </td>
line prints nothing.
Answer:
It is because, there is wrong relationship of models.
解决方案:
在模板文件中尝试以下代码以显示所有用户:
<td> {{userData.user.last_login }}</td>
<td>{{ userData.user.date_joined }} </td>
您试过以下代码:
<td> {{request.user.profile.date_joined }}</td>
<td>{{ request.user.profile.last_login }} </td>
Remember:
Here, you have filtered only those users which are not staff as well as superuser, so these users are normal users. And iflast_login
column printsNone
that means the user has not logged even single time. And fordate_joined
,by default current time is taken by django. And if you see another time than your local machine that means you haven't set time zone inTIME_ZONE
insettings.py
. The timezone for India isAsia/kolkata
, for more info referTime zones
[django-doc].
您可以通过Q(user__last_login__isnull=False)
过滤至少登录过一次的用户。
在视图中尝试此查询:
views.py
def admin_home(request):
data = Profile.objects.filter(Q(user__is_superuser=False), Q(
user__is_staff=False), Q(user__last_login__isnull=False)).order_by('-user__last_login')[:10]
context = {
'data': data,
}
return render(request, "instructor/admin_home.html", context)