【发布时间】:2020-09-16 17:12:41
【问题描述】:
我从 django 开始,我遇到过类似 reverse_lazy 而不是 reverse 和 gettext_lazy 而不是 gettext 的翻译功能。 从网上的资料来看,这些惰性函数似乎只是在使用时才调用原始函数,而不是立即声明它们。 这到底是什么意思,在现实生活中我应该使用惰性版本而不是原始函数。
提前非常感谢
【问题讨论】:
我从 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 还没有被读取,所以 'index',一个命名的 url,还不可用。我们使用 reverse_lazy() 而不是 reverse() 来解决这个问题; 'index' 直到真正需要时才会被评估,现在我们可以根据需要定义我们的属性。
请注意,如果您的视图有用户定义的方法,您可以在需要时在方法内部使用正常的 reverse() 调用,因为与视图属性不同,视图的方法在显式调用该方法之前不会被评估 --到那时,网址就可以使用了。
当然还有其他用例,但 CBV 是需要 reverse_lazy() 的常见情况,特别是在将 url 分配给属性时。
【讨论】: