我想要一个基于课程的视图'主页'。当用户访问主页':
时如果用户是来宾,则调用来宾函数 如果用户已登录,则会调用登录的函数
然后调用的函数设置适当的模板和上下文。
这是正确的方法吗?如果是这样怎么样?我发现的文档只详细说明了功能视图。
谢谢!
答案 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虚拟机调用一个方法,或者为执行所有操作的登录用户调用另一种方法。如果你真的想要调用一个可以完成所有事情的方法,那么最好使用函数视图。