2015-12-17 42 views
0

我想要做什麼:Django的形式分派方法:值錯誤:視圖返回無替代的HttpResponse

我檢查,如果用戶是從「支持」組之前,他可以查看頁面。如果不是,我想在響應頁面中向用戶顯示正確的消息。 我有group_required裝飾器應用於dispatch()方法的視圖,檢查用戶是否來自支持組。

我已經試過

https://stackoverflow.com/a/29744943/2286762 但仍然得到ValueError異常。

我的代碼

view.py

class ScheduledTestView(FormView): 
    ''' 
    Provides an admin panel interface for creating scheduled tests. 
    Scheduled test will be created as active=False intially. 
    ''' 
    serializer_class = TestShortSerializer 
    template_name = 'admin/scheduled_test.html' 
    form_class = ScheduledTestForm 

    @method_decorator(group_required(['support'])) 
    def dispatch(self, request, *args, **kwargs): 
     return super(ScheduledTestView, self).dispatch(request, *args, **kwargs) 

group_required功能

def group_required(group_names): 
    """ 
    group_name will be the list of group name 
    """ 
    def decorator(func): 
     @wraps(func, assigned=available_attrs(func)) 
     def inner(request, *args, **kwargs): 
      user = request.user 
      if user.is_authenticated(): 
       if (user.groups.filter(name__in=group_names) and user.is_staff) or user.is_superuser: 
        return func(request, *args, **kwargs) 
       return redirect_to_login('/admin/') 
     return inner 
    return decorator 

錯誤

GET 請求URL:http://localhost:8000/admin/support/scheduled_test/

Django的版本:1.8.4

異常類型:ValueError異常

異常值:
視圖support.views.ScheduledTestView沒有返回一個HttpResponse對象。它返回None而不是。

異常位置:/home/kishan/.virtualenvs/kishan_pal/local/lib/python3.4/site-packages/django/core/handlers/base.py在get_response,線151

+2

如果用戶未通過身份驗證,「inner」會返回什麼內容? –

+0

這是問題所在。感謝您指出錯誤。 – Kishan

回答

1

作爲@丹尼爾羅斯曼在你的問題下面的評論中提到。如果用戶未通過身份驗證,則inner不會返回任何響應,但在此情況下,它應該返回redirect_to_login('/admin/')

因此改變

def inner(request, *args, **kwargs): 
    user = request.user 
    if user.is_authenticated(): 
     if (user.groups.filter(name__in=group_names) and user.is_staff) or user.is_superuser: 
      return func(request, *args, **kwargs) 
     return redirect_to_login('/admin/') 

def inner(request, *args, **kwargs): 
    user = request.user 
    if user.is_authenticated(): 
     if (user.groups.filter(name__in=group_names) and user.is_staff) or user.is_superuser: 
      return func(request, *args, **kwargs) 
    return redirect_to_login('/admin/') 

應該解決的問題。看到區別return redirect_to_login('/admin/')if區塊之外。

相關問題