success_url reverse_lazy get_context_data form_class createview django redirect django-views

get_context_data - reverse_lazy django



Invertir para success_url en Django Class Based View queja sobre importaciĆ³n circular (2)

El uso de reverse en su método funciona porque se reverse cuando se ejecuta la vista.

def my_view(request): url = reverse(''blog:list-post'') ...

Si anula get_success_url , entonces aún puede usar reverse , porque get_success_url reverse cuando se ejecuta la vista.

class BlogCreateView(generic.CreateView): ... def get_success_url(self): return reverse(''blog:list-post'')

Sin embargo, no puede usar reverse con success_url , porque entonces se llama a la reverse cuando se importa el módulo, antes de que se hayan cargado las URL.

get_success_url es una opción, pero la solución más sencilla es usar reverse_lazy lugar de reverse.

from django.urls import reverse_lazy # from django.core.urlresolvers import reverse_lazy # old import for Django < 1.10 class BlogCreateView(generic.CreateView): ... success_url = reverse_lazy(''blog:list-post'')

Para responder a su pregunta final acerca de reiniciar el servidor de ejecución, el error de configuración ImproperlyConfigured es diferente de TemplateDoesNotExists porque ocurre cuando se carga la aplicación Django.

Cuando se utiliza la vista basada en el método, la redirección a la reverse no se quejó de esto y aún puede encontrar la raíz url conf. Pero, en vistas basadas en la clase, se queja:

ImproperlyConfigured at /blog/new-post/ The included urlconf ''blog.urls'' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import.

Mi clase se define así:

class BlogCreateView(generic.CreateView): form_class = Blog template_name = ''blog/new-post.html'' success_url = reverse(''blog:list-post'')

¿Cómo usar correctamente el reverse para success_url en vistas basadas en clase? Gracias.

PS: Y estoy interesado en por qué es necesario reiniciar runserver después de este error (no como un error como TemplateDoesNotExists que no es necesario reiniciar runserver )


Intente usar reverse_lazy lugar de reverse en su CBV. Es una versión de reverse perezosamente evaluada. No se ejecutará hasta que se necesite el valor.

from django.core.urlresolvers import reverse_lazy class BlogCreateView(generic.CreateView): form_class = Blog template_name = ''blog/new-post.html'' success_url = reverse_lazy(''blog:list-post'')