2012-07-16 3 views
4

pre_delete 신호에 연결된 콜백에서 django 사용자 (모델의 delete 메소드를 호출 함)를 가져올 수 있습니까?django에서 pre_delete 신호의 현재 사용자

+0

당신은 아마도 treadlocal 접근 방식으로 가야 할 것이다, 그러나이 수도 달성하고자하는 바에 따라 문제에 대한 더 나은 접근법이 필요합니다. 즉, 문제의 컨텍스트에 대한 자세한 정보를 제공해야합니다. –

+0

삭제 된 테이블에 대한 정보를 저장하는 백엔드 db에 대한 삭제 트리거가 있습니다. 다른 테이블에 기록하십시오. 나는 누가 django 사용자가 삭제 작업을 시작했는지 정보를 필요로하므로 삭제할 레코드를 django-user id로 업데이트하는 방법을 사용하려고합니다. 그런 식으로 사용자가 트리거를 사용할 수있게됩니다. –

답변

5

신호가 요청 인스턴스를 전달하지 않지만 데코레이터를 추가하고 추가하여 해당 모델을 삭제하는 뷰에서 해당 데코레이터를 사용할 수 있습니다.

이 콜백 함수라고 가정 : 데코레이터에 추가되는

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): 

다음 콜백 당신이 액세스 t을해야합니다 O 요청으로 :

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) 
+0

여러 모델에 대해보다 일반적인 솔루션을 만들 수 있습니까? 솔루션에서 올바르게 이해하면 각 뷰를 각 모델별로 별도로 장식해야합니다. –

+0

물론 미들웨어를 사용합니다. PreDeleteMiddleware의 마지막 두 줄을 지우고 원하는 어떤 모델이든 코드의 어딘가에 추가하십시오. 'pre_delete.connect (pre_delete_cb, sender = some_model)'에서 pre_delete_cb 콜백 메소드를 사용하기 만하면됩니다. 미들웨어는 실제로 실제 모델과 아무런 관련이 없습니다. 요청 속성을 콜백 함수로 설정하면됩니다. 하지만 데코레이터를 사용할 수도 있습니다. pre_delete.connect를 이동하십시오. 요청 객체와 콜백 만 있으면됩니다. – Tisho

관련 문제