我什么时候应该在Django中使用懒惰函数



我从django开始,我遇到了一些函数,比如reverse_lazy而不是reverse,gettext_lazy而不是gettext用于翻译。从我可以上网的信息来看,这些懒惰的函数似乎只在使用时调用原始函数,而不是立即声明。这到底意味着什么,在现实生活中,我应该使用懒惰版本来对抗原始函数。

提前感谢

这是一种只有在特定情况下才需要的东西,正如你自己的直觉所示。

一个常见的例子是基于泛型类的视图。在读取views.py文件时,将评估视图的属性。但是在读取的时候,url文件还没有被读取!因此,使用reverse((为属性赋值将失败,因为发送到reverse(的参数中命名的任何url都将不可用于视图文件。但是使用reverse_lazy((,您可以在基于类的视图中为属性分配一个url,并且在命名的url实际可用之前,它不会更新:

class RegisterView(CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy('index')   # reverse() would fail here!
template_name = 'registration/register.html')

同样:success_url是视图的一个属性,将在读取views.py文件时进行评估。但到那时,url还没有被读取,因此"index",一个命名的url,还不可用。我们使用reverse_lazy((而不是reverse((来解决这个问题;'index’在实际需要之前不会进行评估,现在我们可以根据需要定义我们的属性。

请注意,如果您的视图有一个用户定义的方法,如果需要,您可以在方法内部使用普通的reverse((调用,因为与视图属性不同,在显式调用该方法之前,不会评估视图的方法——到那时,URL将可用。

当然,还有其他用例,但CBV是一种常见的用例,其中reverse_lazy((变得必要,特别是在为属性分配url时。

最新更新