4

pre_delete シグナルに接続されたコールバックで (モデルの delete メソッドを呼び出す) サインインした django ユーザーを取得することは可能ですか?

4

1 に答える 1

6

pre_deleteシグナルはリクエストインスタンスを渡しませんが、それを追加するデコレータを追加し、指定されたモデルを削除するビューでそのデコレータを使用することができます。

これがコールバック関数であると仮定すると:

def pre_delete_cb(sender, instance, using, **kwargs):
    pass

これはデコレータに追加されています:

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

そして、あなたがそれを呼び出す方法でビューでデコレータを使用します-代わりにpre_delete.connect(pre_delete_cb, MyModel)、次を使用します:

@pre_delete_dec(pre_delete_cb, MyModel)
def myview(request):

コールバックでは、次のようにリクエストにアクセスできます。

def pre_delete_cb(sender, instance, using, **kwargs):
    current_user = pre_delete_cb.request.user

ミドルウェアを使用して、ビューごとだけでなく、グローバル レベルでこれを追加できます。

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)
于 2012-07-16T08:55:52.730 に答える