我想根据用户是否登录在同一个URL(主页)显示不同的东西。
因此,如果他未通过身份验证,我将显示一个不涉及任何数据库查询的页面,否则,如果他已登录,我将显示他的项目(这涉及数据库访问)。
那么,鉴于以下情况,我该如何做到这一点:
- 我只有 1 个网址格式
- 我想使用基于类的通用视图(特别是在一种情况下是 TemplateView,在另一种情况下是 DetailView)。
我想根据用户是否登录在同一个URL(主页)显示不同的东西。
因此,如果他未通过身份验证,我将显示一个不涉及任何数据库查询的页面,否则,如果他已登录,我将显示他的项目(这涉及数据库访问)。
那么,鉴于以下情况,我该如何做到这一点:
检查是否 User.is_authenticated(),如果是,则查询项目,如果不是,则不查询项目,并在视图中查看项目变量是否已设置。
通常会使用Login Required装饰器,但由于您只有一个 URL,您可以检查 request.user.is_authenticated() 是否为 True。如果为True,则返回登录用户对应的模板,否则返回另一个。
基于类的视图
看看这个:TemplateView 中需要登录
它使用 dispatch 方法来检查用户是否在基于类的视图中进行了身份验证。
从 django 导入 http 从 django.views 导入通用
class AboutView(generic.TemplateView):
""" About page view. """
template_name = 'about.html'
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated():
raise http.Http404
return super(AboutView, self).dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
ctx = super(AboutView, self).get_context_data(**kwargs)
ctx['something_else'] = None # add something to ctx
return ctx