Django中reverse()和reverse_lazy()之间的区别

时间:2018-02-07 17:08:21

标签: python django

据我所知,我们可以在FBV中使用reverse(),在CBV中使用reverse_lazy()。我知道我们必须在CBV中使用reverse_lazy(),因为导入文件时不会加载url。 参考:Reverse_lazy and URL Loading?

我不明白的是 - 当我们从FBV调用反向时,如何加载URL?当我们在django app中的urls.py顶部导入视图时,urlpatterns列表尚未被评估。 FBV的reverse()如何工作但CBV不工作?

我的问题有道理吗? :P

提前致谢。

问候。

5 个答案:

答案 0 :(得分:9)

#importme.py
def a():
    print("FUNCTION HELLO")

class B():
    print("CLASS HELLO") 


>>> import importme
>>> CLASS HELLO

在导入时评估类属性。何时或究竟如何发生的答案都在python导入系统的深处。

答案 1 :(得分:5)

class NewJobCBV(LoginRequiredMixin, CreateView):
    template_name = 'company/job.html'
    form_class = newJobForm
    #success_url = reverse_lazy('newJob')

def get_success_url(self, **kwargs):
    return reverse("newJob")

@CoffeeBasedLifeform:你是对的,在导入时评估类属性,我在阅读你的答案后进行了检查。所以 1.如果我们使用success_url,我们必须使用reverse_lazy() 2.如果我们在函数内部进行反转,我们可以使用reverse()。

现在很清楚。

感谢CoffeeBasedLifeform :)

答案 2 :(得分:0)

因为:Python类属性在声明中求值。 请阅读以下链接:Python class attributes are...

答案 3 :(得分:0)

只需了解其中的区别:

reverse()返回string reverse_lazy()返回<object>

答案 4 :(得分:0)

Reverse_lazy,顾名思义,是反向 URL 解析器的惰性实现。与传统的反向函数不同,reverse_lazy 直到需要值时才会执行。

它很有用,因为它可以在处理可能无法立即知道的 URL 时防止反向未找到异常。

我们为什么需要它? 这是必需的,因为在导入时评估类属性,那时 Reverse 方法将返回“Reverse Not Found”。 稍后根据需要,在执行时,所有必要的代码片段都将被执行,以提供有效的 URL。