django - 在基于类的 View 中设置基于条件的重定向(Django)

标签 django redirect django-views django-class-based-views

我(初学者)正在创建一个简单的博客应用程序。我创建了一个基于类的 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 对象时立即进行检查,此时 requestargskwargs 不是 尚未设置。事实上,这些是在对象构造之后设置的。你可以在 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/

相关文章:

javascript - 从 Django View 打开新选项卡的命令

jsf - faces-redirect和返回按钮导致其他链接无法正常工作

.htaccess - 尝试修复动态 URL 的 301 重定向 |不工作

python - 如何为匿名用户创建类似 Django 的按钮?

Django:DetailView 从外键获取对象

python - 删除查询集时Django ValidationError

python - 在 db 中存储为字符串后检索相等的 numpy 数组

python - 如何从模板(html)传递列表到Django中查看?

python - 无法更新 CharField - Django

c - 如何将重定向输出写入 C 中循环内的文件?