2013-04-24 180 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

相关问题