4

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

4

3 回答 3

8

您可以以与 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"
于 2013-04-25T03:00:11.470 回答
1

您可以只重定向到不同的 url,并且该 url 也由基于类的视图提供。

网址.py

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

视图.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
于 2013-04-25T03:07:08.073 回答
0

确保用户必须经过身份验证的最佳实践是使用 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
于 2013-04-25T04:29:57.470 回答