我有一个问题,哪个更好reverse
还是reverse_lazy
?,我在某处看到它更好reverse_lazy
,并且最好在所有内容中使用它reverse_lazy
,因为它是一个在运行时执行的函数,不应在加载 Django 期间进行验证。并且reverse
有可能在执行时未对其进行验证,诸如此类...
我的意思是,例如,不要在方法中使用get_success_url
,reverse
而是更好地使用reverse_lazy
,因为它更好。(如上所述。)
def get_success_url(self):
return reverse_lazy('pages:pages')
实际上,这reverse_lazy
几乎完全取代了reverse
(并没有那么夸张)好吧,我希望我能让自己理解。
但是我仍然不能很好地理解reverse
和reverse_lazy
和哪个更好之间有什么区别。另外,每一个究竟是如何工作的?
提前感谢您的回答!
作为 Django 应用程序的一部分,在某个地方必须有一个文档称为“URLConf”的文件,但在您的情况下,它将具有您决定给它的任何名称(通常它会被称为
urls.py
类似的名称,并且可以有几个其中,但将有一个“大师”导入其余部分)。该文件包含一个变量,该变量
urlpatterns
是 url 和必须执行以提供这些 url 的方法之间的映射列表。例如,类似的事情:当 Django 读取该文件时,它知道对路由的请求
articles/2019/
必须转换为执行views.year_archive()
,将 2019 作为参数传递给它。它还将名称“存档”与该视图相关联。好吧,当您使用时,
reverse("archive", kwargs={"year": 2019})
您是在要求 Django 告诉您将导致执行带有参数的视图“存档”year=2019
的路由(它将是路由"/articles/2019/"
)。如果当您运行
reverse()
Django 时,它已经读取了您的urls.py
. 文件,那么它已经有了响应您的信息,因为它已经知道名称“archive”已与 path 相关联/articles/<int:year>/
。reverse("archive", ...)
但是由于在 Python 中一切都是动态的,所以在您执行文件的那一刻,它可能urls.py
还没有被加载(尽管稍后会加载,这取决于 、 等的完成顺序import
)include
。然后尝试使用reverse("archive", ...)
将失败,因为该名称"archive"
尚未与任何路由关联。那个时候它
reverse_lazy()
会很有用。当您使用reverse()
结果时,它是一个字符串(您想要的反向 URL),但是当您使用reverse_lazy()
结果时,它是一个函数,一旦加载了所有配置文件并且即将发送响应,该函数将被最后调用给客户。届时,您将知道名称"archive"
以及reverse_lazy()
您可以reverse()
用来生成回复的功能。我对 Django 没有太多经验,我不能告诉你两者中哪一个“更好”。从我读过的内容来看,似乎人们普遍使用
reverse()
,如果他们遇到错误,他们会将其更改为reverse_lazy()
. 我不知道为什么直接reverse_lazy()
在任何地方使用来省事不是更好,除了后者涉及对另一个函数的额外调用,这可能会对性能产生一些影响,但我认为这种影响可以忽略不计. 事实是它显然reverse_lazy()
很少使用,尽管我无法告诉你为什么。