Django 基于类的视图:如果已登录,则重定向,否则为渲染模板

Django 基于类的视图:如果已登录,则重定向,否则为渲染模板,django,django-views,Django,Django Views,如何以最通用的方式实现这一点?我想重写get(),但是我不得不重写太多的方法。还尝试了as_view(),但我无法从那里访问请求 我还尝试在模板中添加一个,但我认为这不是最好的方法。我怀疑您是否希望将覆盖为查看,除非您正在做一些异常奇怪的事情。它返回一个用作视图的函数。它返回的函数只不过是调用dispatch from django.shortcuts import redirect from django.views.generic import TemplateView class My

如何以最通用的方式实现这一点?我想重写
get()
,但是我不得不重写太多的方法。还尝试了
as_view()
,但我无法从那里访问请求


我还尝试在模板中添加一个
,但我认为这不是最好的方法。

我怀疑您是否希望将
覆盖为查看
,除非您正在做一些异常奇怪的事情。它返回一个用作视图的函数。它返回的函数只不过是调用
dispatch

from django.shortcuts import redirect
from django.views.generic import TemplateView


class MyView(TemplateView):
    template_name = 'my_app/my_template.html'

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return redirect('my-other-view')
        return super(MyView, self).dispatch(request, *args, **kwargs)
可以重写所需的特定方法。例如
get
,或者,如果您想覆盖所有方法(
get
post
等),您应该覆盖
dispatch

from django.shortcuts import redirect
from django.views.generic import TemplateView


class MyView(TemplateView):
    template_name = 'my_app/my_template.html'

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return redirect('my-other-view')
        return super(MyView, self).dispatch(request, *args, **kwargs)

是学习django基于类的视图的一个很好的参考。免责声明:我创建了它。

我将复制@meshy的答案,只需稍加编辑,
请求。user.is\u authenticated
是一个bool,您不能调用它。在
dispatch
方法中仅更改此位:

...

def dispatch(self, request, *args, **kwargs):
    if request.user.is_authenticated:
        ....




通常,对于这样的小编辑,您会对原始答案进行注释,而不会创建新答案。一旦你得到了50点声誉点,你可以感谢你指出了这一点。我现在编辑了我的答案。