繁体   English   中英

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

[英]When should I use a lazy function in Django

我从 django 开始,我遇到过像 reverse_lazy 而不是 reverse 和 gettext_lazy 这样的函数而不是 gettext 进行翻译。 从网上查到的资料,好像这些懒惰的函数都是在使用的时候才调用原来的函数,而不是立即声明。 这到底是什么意思,以及在现实生活中我应该使用惰性版本而不是原始函数。

非常感谢提前

正如您自己的直觉,这是一种仅在特定情况下才需要的事情。

一个常见的例子是基于通用类的视图。 在读取 views.py 文件时评估视图的属性。 但是在它被读取的时候,urls 文件还没有被读取! 因此,使用 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 将不会被读取,因此命名 url 'index' 尚不可用。 我们使用 reverse_lazy() 而不是 reverse() 来解决这个问题; 'index' 在实际需要之前不会被评估,现在我们可以根据需要定义我们的属性。

请注意,如果您的视图具有用户定义的方法,则可以在需要时在方法内部使用普通的 reverse() 调用,因为与视图属性不同,视图的方法在该方法被显式调用之前不会被评估——并且时间,网址将可用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM