Django反向导致url循环导入,为什么?

时间:2015-12-01 22:58:02

标签: django django-urls

我收到此错误:

  

随附的urlconf' fouraxis.urls'似乎没有任何   其中的模式。如果您在文件中看到有效模式,那么问题就出现了   可能是由循环导入引起的。

我知道url模式中有一些内容,它看起来像这样:

from django.conf.urls import include, url
from django.contrib import admin

    urlpatterns = [
        url(r'^perfil/', include('clientes.urls'), namespace="cliente"),
        url(r'^admin/', include(admin.site.urls))
    ]

clientes.urls:

from django.conf.urls import url
from django.contrib.auth import views as auth_views

from clientes import views

urlpatterns = [
        # login
        url(r'^login/$', auth_views.login, {'template_name': 'perfiles/login.html'}, name="login"),
        url(r'^logout/$', auth_views.logout, {'template_name': 'perfiles/logged_out.html'}, name="login"),

        url(r'^mi_perfil/$', views.mi_perfil, name="mi_perfil"),
        url(r'^registro_usuario/$', views.RegistroUsuario.as_view(), name="registro_usuario")
    ]

RegistroUsuario视图如下所示:

class RegistroUsuario(FormView):
    template_name = "perfiles/registro_usuario.html"
    form_class = UserCreationForm
    success_url = reverse("cliente:mi_perfil")  # THIS REVERSE

    def form_valid(self, form):
        return redirect("cliente:mi_perfil")

    context = {'form': UserCreationForm}

我知道我可以用reverse这样的纯文本网址替换perfil/mi_perfil。但是,我想知道为什么这种情况发生逆转,我无法找到de docs的解释。另外,使用reverse是更好的,因为它是动态的(如果我改变url,只要它保持其名称,它仍然有效)。

1 个答案:

答案 0 :(得分:7)

导入视图时进行reverse()调用,这可能是首次加载urlconf时。您需要使用reverse_lazy()代替:

from django.core.urlresolvers import reverse_lazy

class RegistroUsuario(FormView):
    template_name = "perfiles/registro_usuario.html"
    form_class = UserCreationForm
    success_url = reverse_lazy("cliente:mi_perfil")  # THIS REVERSE

    def form_valid(self, form):
        return redirect("cliente:mi_perfil")

    context = {'form': UserCreationForm}