首页 > 解决方案 > 我什么时候应该在 Django 中使用惰性函数

问题描述

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

非常感谢提前

标签: pythondjango

解决方案


正如您自己直觉的那样,这是仅在特定情况下才需要的东西。

一个常见的例子是基于通用类的视图。读取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 分配给属性时。


推荐阅读