解释返回super()。get(request,* args,** kwargs)

时间:2018-05-05 17:56:23

标签: django

您好我想了解这行代码:

return super().get(request, *args, **kwargs)

此行是views.py文件中基于类的视图中方法的一部分,例如

class HomePage(TemplateView):
    template_name = "index.html"

    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return HttpResponseRedirect(reverse("afterlogin"))
        return super().get(request, *args, **kwargs)

我知道这个方法将检查当前用户是否经过身份验证并在这种情况下重定向到另一个tempalte(afterlogin),如果用户已登录,否则它将保留在index.html中然后此函数将执行此行return super().get(request, *args, **kwargs)无论如何{我不理解这一行}。例如,如果我们重定向到登录页面,那么最后一行会做什么呢? ..这是我理解的一般想法,但我想了解代码的细节,如:

如果有人可以解释:

1-为什么我在get函数中有这些参数:(self, request, *args, **kwargs)

2-这个方法:def get(self, request, *args, **kwargs):会被触发或调用吗?

3-  解释get方法中的最后一行:return super().get(request, *args, **kwargs)一步一步,它的目的是什么。

如果有人能详细解释因为我还在学习,我将不胜感激。非常感谢

1 个答案:

答案 0 :(得分:1)

super()函数表示当前的父类(在这种情况下,这意味着TemplateView)。

在您的代码中,这意味着,如您所述,get()将首先检查用户是否经过身份验证;如果是,则会重定向到afterlogin网址。但是,如果用户未经过身份验证,则该函数将不会返回,因此它将继续调用get()的{​​{1}}方法(使用与您的相同的参数 TemplateView),如果你没有继承它,它将输出正常输出的内容。

要了解具体情况,您可以导航到源代码中的get()并阅读其TemplateView方法。

关于你的第二个问题:当用户导航到你在项目中定义的URL时,Django将检查用于请求的方法(如果他们只是第一次查看页面,那将是GET;另一个示例是POST,您之前可能已经听过)并使用相应的名称get()调用您的视图方法(HomePage)。如果您还定义了get()方法,则在用户使用POST方法请求页面时将调用该方法,例如通过提交带有post()的表单。

关于你的第一个问题:method="post"是一个HTTP请求对象,它被传递给函数,基本上告诉他们用户(浏览器)请求了什么,它想做什么。 request是可能已添加到*args调用的所有其他位置参数的列表。 get()的相同状态,而不是关键字参数的字典。这些很可能是空的,但我们将它们传递到较高级别是好的,这样我们就不会丢失任何可能需要的功能。

举个例子,如果你转到**kwargs之类的网址,这将是一个GET请求,它会包含一个关键字参数,其中包含键mysite.com/page/search?=myquery和值search,所以你的** kwargs看起来像:myquery。同样地,POST提交的表单内容可供您的方法使用,以执行您需要的操作。