【问题标题】:Class-based view delegate to another view基于类的视图委托给另一个视图
【发布时间】:2013-04-24 23:42:46
【问题描述】:

是否可以将基于类的视图委托给特定的基于类的视图?具体来说,我想做的是拥有/指向一个名为“home”的视图,如果用户登录,则带有委托给视图 A 的主视图,或者如果没有用户登录,则指向视图 B。或者我可以做一个重定向到不同的 URL。我不确定这里的最佳做法是什么。

【问题讨论】:

    标签: django


    【解决方案1】:

    您可以在一个视图中调用另一个视图,方法与 url 中使用的方式相同

    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"
    

    【讨论】:

      【解决方案2】:

      您可以只重定向到不同的 url,并且该 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
      

      【讨论】:

        【解决方案3】:

        确保用户必须经过身份验证的最佳做法是使用 Mixin:

        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
        

        【讨论】:

        • 当然可以,但这可以仅针对为登录用户提供服务的视图来完成。对于给定的 URL,您的回答没有说​​明如何为登录用户使用 1 个视图,为未登录用户使用 1 个视图。
        猜你喜欢
        • 2014-06-06
        • 2018-01-01
        • 1970-01-01
        • 2013-02-04
        • 2019-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多