Entiendo que podemos usar reverse() en FBV y reverse_lazy() en CBV. Entiendo que tenemos que usar reverse_lazy() en CBV ya que las URL no se cargan cuando se importa el archivo (Ref: Reverse_lazy and URL Loading? )
Lo que no entiendo es:
¿Cómo se cargan las urls cuando llamamos a reverse desde el FBV? Como cuando importamos las vistas en la parte superior de urls.py en una aplicación de Django, la lista de patrones de urlpatterns aún no se ha evaluado. ¿Cómo funciona reverse() para FBV pero no para CBV?
Considere estas dos formas de definir la URL_suceso. El primero está comentado, el segundo es la función:
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: tiene razón, los atributos de clase se evalúan al importar, lo verifiqué después de leer su respuesta. Asi que,
success_url , tenemos que usar reverse_lazy() .reverse() .Ahora es cristalino.
Gracias CoffeeBasedLifeform :)
#importme.py def a(): print("FUNCTION HELLO") class B(): print("CLASS HELLO") >>> import importme >>> CLASS HELLOEditar: La razón: el proceso de creación de clases implica ejecutar el cuerpo de la clase.
El cuerpo de la clase se ejecuta (aproximadamente) como
exec(body, globals(), namespace). [...] Una vez que el espacio de nombres de la clase se ha llenado ejecutando el cuerpo de la clase, el objeto de la clase se crea llamando ametaclass(name, bases, namespace, **kwds).
https://docs.python.org/3/reference/datamodel.html?highlight=metaclass#ejecutando-el-cuerpo-de-clase
Mi texto de respuesta original. Puedes ignorarlo. Solo lo dejo porque el comentario de mirek fue una respuesta directa:
Los atributos de clase se evalúan en la importación. La respuesta a cuándo o exactamente cómo sucede eso reside en las profundidades del sistema de importación de python.
Solo entiende la diferencia:
reverse() devuelve una string & reverse_lazy() devuelve un <object>