上述方法在 signals中获取不到用户
时间: 2024-03-11 16:45:54 浏览: 20
如果你在 Django 的 Signals 中使用上述方法仍然无法获取到当前用户,可能是因为 Signals 的执行上下文不同于视图函数的执行上下文,因此在 Signals 中无法直接获取当前用户。但是,你可以尝试以下方法:
1. 传递当前用户作为 Signals 的参数,将当前用户的信息作为参数传递给 Signals,这样 Signals 中就可以获取到当前用户的信息。
2. 使用 Python 的线程本地存储(Thread-local storage),在视图函数中将当前用户信息存储到线程本地存储中,在 Signals 中从线程本地存储中获取当前用户的信息。这种方法需要注意的是,线程本地存储中的数据只在当前线程中有效,因此需要确保 Signals 执行的线程和视图函数执行的线程是同一个线程。
3. 使用 Django 的中间件,在中间件中将当前用户信息存储到请求对象中,在 Signals 中从请求对象中获取当前用户的信息。这种方法需要注意的是,中间件可能会被多个请求调用,因此需要确保在同一个请求中只存储一次当前用户信息。
需要注意的是,以上方法都需要在视图函数中获取到当前用户信息后,将其传递给 Signals 或存储到线程本地存储或请求对象中,以便 Signals 中可以获取到当前用户的信息。
相关问题
上述例子中如何获取当前登录用户
在 Django 中,可以通过 request.user 来获取当前登录的用户对象,但是在 signals 中是无法直接获取 request 对象的。因此,我们需要在处理 signals 时手动传入当前登录用户对象。
假设我们有一个基于类的视图(Class-based View)如下所示:
```python
from django.views.generic import CreateView
from myapp.models import MyModel
class MyModelCreateView(CreateView):
model = MyModel
fields = ['name']
def form_valid(self, form):
form.instance.created_by = self.request.user
return super().form_valid(form)
```
我们可以在 form_valid 方法中将当前登录的用户对象赋值给 MyModel 对象的 created_by 字段。在信号处理函数中,我们可以通过传入 created_by 参数来获取当前登录用户对象,如下所示:
```python
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from myapp.models import MyModel, OperationRecord
@receiver(post_save, sender=MyModel)
def save_mymodel(sender, instance, created, created_by=None, **kwargs):
if created:
operate_type = 'add'
else:
operate_type = 'change'
operator = created_by or User.objects.get(username='admin')
operate_obj = f"{instance._meta.verbose_name}({instance.name})"
OperationRecord.objects.create(
operate_type=operate_type,
operator=operator,
operate_obj=operate_obj,
)
```
在上面的信号处理函数中,我们增加了一个 created_by 参数,用于接收当前登录用户对象。在视图中调用信号时,我们可以通过传递 created_by=request.user 来将当前登录用户对象传递给信号处理函数。
django如何在post-save中获取当前登录用户信息
在 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` 是应用的名称。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)