Django 1.8(Python 3.4):根据基于类的视图的用户授权显示不同的模板

时间:2015-07-19 14:44:00

标签: python django django-views authorization

我想要一个基于课程的视图'主页'。当用户访问主页':

如果用户是来宾,则调用来宾函数 如果用户已登录,则会调用登录的函数

然后调用的函数设置适当的模板和上下文。

这是正确的方法吗?如果是这样怎么样?我发现的文档只详细说明了功能视图。

谢谢!

2 个答案:

答案 0 :(得分:1)

你知道,你的问题确实是开放式的。有很多不同的方法可以做到这一点。

我可能会继承TemplateView,覆盖dispatch方法,根据场景设置不同的模板。

为了弄清楚你的逻辑如何适应各种CBV,我推荐使用Classy Class-Based-Views资源,这样你就可以看到哪些方法被调用了。

答案 1 :(得分:1)

我会覆盖get_template_names来设置模板名称,并get_context_data来设置上下文数据。您可以使用self.request.user访问该用户,并使用is_authenticated()方法检查他们是否已登录。

class HomepageView(TemplateView):
    def get_context_data(self, **kwargs):
        """
        Returns a different context depending
        on whether the user is logged in or not
        """
        context = super(HomepageView, self).get_context_data(**kwargs)
        if self.request.user.is_authenticated():
            context['user_type'] = 'logged in'
        else:
            context['user_type'] = 'guest'
        return context

    def get_template_names(self):
        """
        Returns a different template depending
        on whether the user is logged in or not
        """
        if self.request.user.is_authenticated():
            return 'logged_in_homepage.html'
        else:
            return 'guest_homepage.html'

请注意,我已经覆盖了TemplateView的不同方法来自定义功能,而不是为guest虚拟机调用一个方法,或者为执行所有操作的登录用户调用另一种方法。如果你真的想要调用一个可以完成所有事情的方法,那么最好使用函数视图。