Paw*_*ski 4 django django-signals django-models
是否有可能在连接到pre_delete信号的回调中获得已登录的django用户(调用模型的删除方法)?
该pre_delete信号不传递请求实例,但你可以添加一个装饰,,增加了它,并使用装饰上来看,它删除指定的型号.
假设这是回调函数:
def pre_delete_cb(sender, instance, using, **kwargs):
pass
Run Code Online (Sandbox Code Playgroud)
这是在装饰器中添加的:
from django.db.models.signals import pre_delete
from functools import wraps
from django.utils.decorators import available_attrs
def pre_delete_dec(cb, sender):
def decorator(view_func):
@wraps(view_func, assigned=available_attrs(view_func))
def _wrapped_view(request, *args, **kwargs):
cb.request = request # here we add the request to the callback function
pre_delete.connect(cb, sender=sender) # and connecting the real pre_delete to the callback
return view_func(request, *args, **kwargs)
return _wrapped_view
return decorator
Run Code Online (Sandbox Code Playgroud)
并以您调用它的方式在视图上使用装饰器 - 而不是pre_delete.connect(pre_delete_cb, MyModel)使用:
@pre_delete_dec(pre_delete_cb, MyModel)
def myview(request):
Run Code Online (Sandbox Code Playgroud)
然后在回调中,您将有权访问该请求:
def pre_delete_cb(sender, instance, using, **kwargs):
current_user = pre_delete_cb.request.user
Run Code Online (Sandbox Code Playgroud)
您可以在全局级别添加此功能,而不仅仅是每个视图 - 使用中间件:
from django.db.models.signals import pre_delete
def pre_delete_cb(sender, instance, using, **kwargs):
current_user = pre_delete_cb.request.user
class PreDeleteMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
pre_delete_cb.request = request
from myapp.models import MyModel
pre_delete.connect(pre_delete_cb, sender=MyModel)
Run Code Online (Sandbox Code Playgroud)