簡體   English   中英

基於類的視圖委托給另一個視圖

[英]Class-based view delegate to another view

是否可以將基於類的視圖委托給特定的基於類的視圖? 具體來說,我想做的是/指向一個名為'home'的視圖,如果用戶已登錄,則指向View A的主視圖;如果沒有用戶登錄,則指向View B.或者我可以執行重定向到其他網址。 我不確定這里最好的做法是什么。

您可以使用在網址中使用的相同方式從視圖中調用另一個視圖

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"

您只需重定向到另一個網址,該網址也可以通過基於類的視圖提供。

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

確保用戶必須通過身份驗證的最佳做法是使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM