django如何在post-save中获取当前登录用户信息
时间: 2024-03-10 13:48:13 浏览: 23
在 Django 中,可以通过 `request.user` 来获取当前登录用户信息。但是在 `post_save` 信号中无法直接获取 `request` 对象,因为该信号是在数据库中保存数据之后发送的。因此,我们可以通过其他方式来获取当前登录用户信息,例如使用 Django 的信号机制。
具体实现步骤如下:
1. 在 `models.py` 中定义一个信号,用于在保存数据之后发送信号。
```python
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def user_saved(sender, instance, created, **kwargs):
if created:
# 新建用户,不对其进行操作
pass
else:
# 已有用户,更新其它信息
# 在这里可以获取当前登录用户信息
request = kwargs.get('request')
user = request.user
# 对已有用户进行其它操作
```
2. 在视图函数中,发送信号并传递 `request` 对象。
```python
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.contrib.auth import get_user_model
from .models import user_saved
User = get_user_model()
@login_required
def my_view(request):
# 获取当前登录用户信息
user = request.user
# 发送信号并传递 request 对象
post_save.connect(user_saved, sender=User, request=request)
# 其它操作
return render(request, 'my_template.html')
```
在上述代码中,我们使用 `post_save.connect()` 方法连接信号和信号处理函数,并传递 `request` 对象作为参数。
注意,在使用信号时,需要在 `models.py` 中导入信号处理函数,否则信号不会被注册。可以在 `models.py` 中导入信号处理函数,也可以在 `apps.py` 中导入。如果在 `apps.py` 中导入,需要在应用的 `__init__.py` 中加入以下代码:
```
default_app_config = 'my_app.apps.MyAppConfig'
```
其中,`MyAppConfig` 是应用的配置类,`my_app` 是应用的名称。