【问题标题】:Django reverse causing url circular import, why?Django反向导致url循环导入,为什么?
【发布时间】:2016-03-06 01:11:20
【问题描述】:

我收到此错误:

包含的 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,只要它保留其名称,它仍然有效)。

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    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}
    

    【讨论】:

    • 谢谢,reverse_lazy 是解决方案。所以.. 导入视图时urlconf还没有加载?
    • 你在你的 urlconf 中导入视图......所以没有。
    • 对于 Django 2.0+,将 django.core.urlresolvers 替换为 django.urls
    猜你喜欢
    • 2013-04-30
    • 2020-11-05
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多