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