2013-04-24 165 views
4

是否有可能將基於類的視圖委託給特定的基於類的視圖?具體來說,我想要做的是指向一個名爲「home」的視圖,以及如果用戶已登錄,則將委託給View A的視圖,如果沒有用戶登錄,則視圖B也可以。重定向到一個不同的URL。我不確定這裏最好的做法是什麼。基於類的視圖委託給另一個視圖

回答

7

你可以調用另一個視圖從視圖中在網址

class HomeView(TemplateView): 
    template_name="index.html" 

    def dispatch(self, request, *args, **kwargs): 
    if request.user.is_authenticated(): 
     view=UserHomeView.as_view() 
     return view(request, *args, **kwargs) 
    return super(HomeView, self).dispatch(request, *args, **kwargs) 


class UserHomeView(TemplateView): 
    template_name="user.html" 
1

您可以直接重定向到一個不同的URL使用的相同方式和網址也由一個基於類視圖服務。

urls.py

url(r'^$', HomeView.as_view(), name='home'), 
url(r'^login/', LoginView.as_view(), name='login'), 
url(r'^welcome/$', WelcomeView.as_view(), name='welcome') 

views.py

class HomeView(TemplateView): 

    def get(self, request, *args, **kwargs): 
     if request.user.is_authenticated(): 
      return HttpResponseRedirect(reverse('welcome')) 
     else: 
      return HttpResponseRedirect(reverse('login')) 

class WelcomeView(TemplateView): 

    def get(self, request, *args, **kwargs): 
     #do something 

class LoginView(TemplateView): 

    def get(self, request, *args, **kwargs): 
     #show login page 
0
,以確保用戶進行驗證

最佳做法是使用密新:

from django.contrib.auth.decorators import login_required 
from django.utils.decorators import method_decorator 
from django.views.generic import TemplateView 


class LoginRequiredMixin(object): 
    u"""Ensures that user must be authenticated in order to access view.""" 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(LoginRequiredMixin, self).dispatch(*args, **kwargs) 

class MyView(LoginRequiredMixin, TemplateView): 

    def get(self, request, *args, **kwargs): 
     #do something 
+0

當然,但可以這樣做僅用於爲登錄用戶提供服務的視圖。對於給定的URL,您的答案不解決如何針對登錄用戶使用1個視圖以及針對未登錄用戶使用1個視圖。 – dgrant 2013-04-25 04:32:17

相關問題