我(初学者)正在创建一个简单的博客应用程序。我创建了一个基于类的 View 来创建博客文章,它有一个单独的 URL。如果用户未登录,我希望它重定向到登录页面(url name = 'login')。在基于函数的 View 中,我所要做的就是:
def postCreateView(request):
if not request.user.is_authenticated:
return redirect('login')
我不知道如何在基于类的 View (继承自通用 CreateView)中执行此操作。我尝试修改 init() 方法,如下所示:
def redirectLogin(self):
return redirect('login')
def __init__(self, *args, **kwargs):
if(not self.request.user.is_authenticated):
redirectLogin()
super().__init__()
(我将类命名为 PostCreateView)但是在调试时,异常值是'PostCreateView'对象没有属性'request'
。我需要正确的方法(Django 约定方法,如果存在)在基于类的 View 中设置基于条件的重定向。
我也很困惑为什么它说 View 没有属性“请求”。每个 View 都有请求。我确信这一点,因为我重写了 form_valid()
方法,将帖子的作者设置为当前登录的用户,如下所示:
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid()
当我登录并创建帖子时,它运行得非常好。
提前致谢。
最佳答案
Every view has request. I'm sure about it because I overrode the
form_valid()
不,因为那是构造函数。您在构造 View 对象时立即进行检查,此时 request
、args
和 kwargs
不是 尚未设置。事实上,这些是在对象构造之后设置的。你可以在 view
function [GitHub] 的源代码中看到这一点:
def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.<b>setup(</b>request, *args, **kwargs<b>)</b> if not hasattr(self, 'request'): raise AttributeError( "%s instance has no 'request' attribute. Did you override " "setup() and forget to call super()?" % cls.__name__ ) return self.dispatch(request, *args, **kwargs)
和 setup
function [GitHub]设置 .request
、.args
和 .kwargs
:
def setup(self, request, *args, **kwargs): """Initialize attributes shared by all view methods.""" <b>self.request = request</b> self.args = args self.kwargs = kwargs
即使存在请求对象,也无法解决问题,因为在 __init__
中返回 redirect
并不是底层 View 机制所预期的,因此,它很可能会在某个地方引发另一个错误。
话虽这么说,你在这里所做的事情以前已经做过了。您可以使用 LoginRequiredMixin
[Django-doc] :
from django.views.generic.edit import CreateView
from django.contrib.auth.mixins import <b>LoginRequiredMixin</b>
class MyCreateView(<b>LoginRequiredMixin</b>, CreateView):
# ...
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid()
关于django - 在基于类的 View 中设置基于条件的重定向(Django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58040226/