Django 中 reverse() 和 reverse_lazy() 的区别

新手上路,请多包涵

我知道我们可以在 FBV 中使用 reverse() reverse_lazy() 在 CBV 中使用 —。我知道我们必须在 CBV 中使用 reverse_lazy() ,因为导入文件时未加载 url(参考: Reverse_lazy 和 URL Loading?

我不明白的是:

当我们从 FBV 调用 reverse 时,url 是如何加载的?当我们在 Django 应用程序中导入 urls.py 顶部的视图时, urlpatterns 列表还有待评估。 reverse() 对 FBV 有效但对 CBV 无效?

原文由 RyuCoder 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 957
2 个回答
#importme.py
def a():
    print("FUNCTION HELLO")

class B():
    print("CLASS HELLO")


>>> import importme
>>> CLASS HELLO

编辑: 原因:类创建过程涉及执行类的主体。

类主体(大约)执行为 exec(body, globals(), namespace) 。 […]一旦通过执行类主体填充了类命名空间,就会通过调用 metaclass(name, bases, namespace, **kwds) 创建类对象。

https://docs.python.org/3/reference/datamodel.html?highlight=metaclass#executing-the-class-body



我的原始答案文本。你可以忽略它——我只是把它留在原处,因为 mirek 的评论是对它的直接回应:

类属性在导入时进行评估。何时或如何发生的答案存在于 python 导入系统的深处。

原文由 CoffeeBasedLifeform 发布,翻译遵循 CC BY-SA 4.0 许可协议

考虑这两种定义 success_url 的方法。第一个被注释掉,第二个是函数:

 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 :)

原文由 RyuCoder 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题