在基于类的视图(Django)中设置基于条件的重定向

在基于类的视图(Django)中设置基于条件的重定向,django,redirect,django-views,django-class-based-views,Django,Redirect,Django Views,Django Class Based Views,我(初学者)正在创建一个简单的博客应用程序。我创建了一个基于类的视图来创建博客文章,它有一个单独的URL。如果用户未登录,我希望它重定向到登录页面(url名称='login')。在基于函数的视图中,我需要做的是: def postCreateView(request): if not request.user.is_authenticated: return redirect('login') 我不知道如何在基于类的视图(继承自泛型CreateView)中执行此操作。我试图修改init

我(初学者)正在创建一个简单的博客应用程序。我创建了一个基于类的视图来创建博客文章,它有一个单独的URL。如果用户未登录,我希望它重定向到登录页面(url名称='login')。在基于函数的视图中,我需要做的是:

def postCreateView(request):
if not request.user.is_authenticated:
    return redirect('login')
我不知道如何在基于类的视图(继承自泛型CreateView)中执行此操作。我试图修改init()方法,如下所示:

def redirectLogin(self):
     return redirect('login')

 def __init__(self, *args, **kwargs):
     if(not self.request.user.is_authenticated):
         redirectLogin()
     super().__init__()
def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid()
(我将类命名为PostCreateView),但在调试时,异常值为
“PostCreateView”对象没有属性“request”
。我需要正确的方法(Django约定方法,如果存在的话)在基于类的视图中设置基于条件的重定向

我还不明白为什么它说视图没有“request”属性。每个视图都有请求。我对此很确定,因为我重写了
form\u valid()
方法,将帖子的作者设置为当前登录的用户,如下所示:

def redirectLogin(self):
     return redirect('login')

 def __init__(self, *args, **kwargs):
     if(not self.request.user.is_authenticated):
         redirectLogin()
     super().__init__()
def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid()
当我登录并创建帖子时,它运行得非常好

提前谢谢

每个视图都有请求。我对此很确定,因为我重写了
表单\u valid()

否,因为这是构造函数。构建视图对象时,您会立即进行检查,此时尚未设置
请求
参数
kwargs
。事实上,这些都是在构建对象之后设置的。您可以在的源代码中看到:

但是,即使存在请求对象,这也无法解决问题,因为在
\uuuu init\uuuuu
中返回
重定向
并不是底层视图机制所期望的,因此它可能会在某个地方引发另一个错误

也就是说,你在这里做的事以前已经做过了。您可以使用:

来自django.views.generic.edit导入CreateView
从django.contrib.auth.mixins导入登录名RequiredMixin
类MyCreateView(LoginRequiredMixin,CreateView):
# ...
def表单_有效(自身、表单):
form.instance.author=self.request.user

return super()

您的方法是错误的,因为您正在重写
\uuuuu init\uuuu
;如果要在执行视图之前进行检查,可能需要查看覆盖
dispatch()

from django.views.generic.edit import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin

class MyCreateView(LoginRequiredMixin, CreateView):
    # ...

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid()
def dispatch(self, request, *args, **kwargs):
    if request.user.is_authenticated:
        return super().dispatch(request, *args, **kwargs)
    return redirect()