据我所知,我们可以在FBV中使用reverse(),在CBV中使用reverse_lazy()。我知道我们必须在CBV中使用reverse_lazy(),因为导入文件时不会加载url。 参考:Reverse_lazy and URL Loading?
我不明白的是 - 当我们从FBV调用反向时,如何加载URL?当我们在django app中的urls.py顶部导入视图时,urlpatterns列表尚未被评估。 FBV的reverse()如何工作但CBV不工作?
我的问题有道理吗? :P
提前致谢。
问候。
答案 0 :(得分:9)
#importme.py
def a():
print("FUNCTION HELLO")
class B():
print("CLASS HELLO")
>>> import importme
>>> CLASS HELLO
在导入时评估类属性。何时或究竟如何发生的答案都在python导入系统的深处。
答案 1 :(得分:5)
class NewJobCBV(LoginRequiredMixin, CreateView):
template_name = 'company/job.html'
form_class = newJobForm
#success_url = reverse_lazy('newJob')
def get_success_url(self, **kwargs):
return reverse("newJob")
@CoffeeBasedLifeform:你是对的,在导入时评估类属性,我在阅读你的答案后进行了检查。所以 1.如果我们使用success_url,我们必须使用reverse_lazy() 2.如果我们在函数内部进行反转,我们可以使用reverse()。
现在很清楚。
感谢CoffeeBasedLifeform :)
答案 2 :(得分:0)
因为:Python类属性在声明中求值。 请阅读以下链接:Python class attributes are...
答案 3 :(得分:0)
只需了解其中的区别:
reverse()返回string
和 reverse_lazy()返回<object>
答案 4 :(得分:0)
Reverse_lazy,顾名思义,是反向 URL 解析器的惰性实现。与传统的反向函数不同,reverse_lazy 直到需要值时才会执行。
它很有用,因为它可以在处理可能无法立即知道的 URL 时防止反向未找到异常。
我们为什么需要它? 这是必需的,因为在导入时评估类属性,那时 Reverse 方法将返回“Reverse Not Found”。 稍后根据需要,在执行时,所有必要的代码片段都将被执行,以提供有效的 URL。