【问题标题】:When should I use a lazy function in Django我什么时候应该在 Django 中使用惰性函数
【发布时间】:2020-09-16 17:12:41
【问题描述】:

我从 django 开始,我遇到过类似 reverse_lazy 而不是 reverse 和 gettext_lazy 而不是 gettext 的翻译功能。 从网上的资料来看,这些惰性函数似乎只是在使用时才调用原始函数,而不是立即声明它们。 这到底是什么意思,在现实生活中我应该使用惰性版本而不是原始函数。

提前非常感谢

【问题讨论】:

    标签: python django


    【解决方案1】:

    这种事情只在特定情况下才需要,就像你自己直觉的那样。

    一个常见的例子是基于通用类的视图。读取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 还没有被读取,所以 'index',一个命名的 url,还不可用。我们使用 reverse_lazy() 而不是 reverse() 来解决这个问题; 'index' 直到真正需要时才会被评估,现在我们可以根据需要定义我们的属性。

    请注意,如果您的视图有用户定义的方法,您可以在需要时在方法内部使用正常的 reverse() 调用,因为与视图属性不同,视图的方法在显式调用该方法之前不会被评估 --到那时,网址就可以使用了。

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

    【讨论】:

      猜你喜欢
      • 2012-07-25
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2020-04-23
      • 2018-06-26
      • 1970-01-01
      相关资源
      最近更新 更多