2012-01-15 44 views
2

在我的Django項目,我通常測試,如果視圖被稱爲是正確使用:Django的測試返回_wrapped_view作爲視圖名稱,而不是正確的視圖名稱

viewName = resolve(response.request["PATH_INFO"])[0].func_name 
self.assertEqual(viewName,'correct_view_name') 

我是能夠成功地做到這一點,直到我增加了一個裝飾。從那時起,我的觀點正常運作,但我無法測試(至少像這樣)正確的視圖名稱。

我添加的裝飾看起來是這樣的:

def owner_required(view_func, Model): 
    ''' 
    checks if the object is being accessed but its owner 
    ''' 
    def decorator(view_func): 
     def _wrapped_view(request, *args, **kwargs): 
      obj = Model.objects.get(pk=int(kwargs['pk'])) 
      if obj.user == request.user: 
       return view_func(request, *args, **kwargs) 
      return HttpResponse('You don't have access to this page.') 
     return _wrapped_view 
    return decorator(view_func) 

當我申請這個裝飾始終是「_wrapped_view」

我怎樣才能使視圖名稱回到正常的的resolve(response.request["PATH_INFO"])[0].func_name結果呢?

感謝

回答

3

您可以在裝飾用functools.wraps

try: 
    from functools import wraps 
except ImportError: 
    from django.utils.functional import wraps # Python 2.4 fallback. 
from django.utils.decorators import available_attrs 

def owner_required(view_func, Model): 
    ''' 
    checks if the object is being accessed but its owner 
    ''' 
    def decorator(view_func): 
     @wraps(view_func, assigned=available_attrs(view_func)) 
     def _wrapped_view(request, *args, **kwargs): 
      obj = Model.objects.get(pk=int(kwargs['pk'])) 
      if obj.user == request.user: 
       return view_func(request, *args, **kwargs) 
      return HttpResponse('You don't have access to this page.') 
     return _wrapped_view 
    return decorator(view_func) 
+0

感謝您的快速響應!它非常完美! – duduklein 2012-01-15 13:28:00