python - 我什么时候应该在 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 还没有被读取,所以 'index',一个命名的 url,还不可用。我们使用 reverse_lazy() 而不是 reverse() 来解决这个问题;'index' 在实际需要之前不会被评估,现在我们可以根据需要定义我们的属性。
请注意,如果您的视图具有用户定义的方法,则可以在需要时在该方法内使用正常的 reverse() 调用,因为与视图属性不同,视图的方法在显式调用该方法之前不会被评估 - 并且由此时间,网址将可用。
当然,还有其他用例,但 CBV 是需要 reverse_lazy() 的常见情况,特别是在将 url 分配给属性时。
推荐阅读
- consul - hashicorp consul is not publishing all the metrics
- instagram - Instagram api thumbnail_url 给出 5xx 服务器错误
- python-3.x - 识别重叠对象
- c# - 检查结束前是否少于 7 天
- jquery - If/else statement making link work or disabled
- asp.net-core - MVC based authentication templates in ASP.NET Core 2.0
- hibernate - 获取半径内的所有位置(Spring Boot)
- php - 将带有变量的链接添加到 WooCommerce 邮件
- python-3.x - Watson speech to text: Invalid credentials error (Code: 401)
- docker - Is it possible to assign static ip to a stateful container in kubernates? if yes how it can be