Django NoReverseMatch,不是已注册的命名空间

时间:2017-09-12 13:50:57

标签: django django-urls

我的项目模板中有以下链接:

<li><a id="toggleLogin" href= "{% url 'login' %}" onclick="toggleLogin();" ><span>Login</span></a></li> <!-- login app
-->

项目网址是:

url(r'^login/',loginViews.user_login,name='login'),

应用网址是:

url(r'^$',views.user_login,name='user_login'),

,应用视图是:

def user_login(request):
    """User at login view """
    #
    if request.method == 'POST':
        # First get the username and password supplied
        username = request.POST.get('username')
        password = request.POST.get('password')
        # Django's built-in authentication function:
        user = authenticate(username=username, password=password)
        # If we have a user
        if user:
            #Check it the account is active
            if user.is_active:
                # Log the user in.
                login(request,user)
                # Send the user back to some page.
                # In this case their homepage.
                return HttpResponseRedirect(reverse('index'))
            else:
                # If account is not active:
                return HttpResponse("Your account is not active.")
        else:
            print("Someone tried to login and failed.")
            print("They used username: {} and password: {}".format(username,password))
            return HttpResponse("Invalid login details supplied.")
    else:
        #Nothing has been provided for username or password.
        return render(request, 'login.html', {})

但是一旦链接点击,就会返回以下django错误:

NoReverseMatch at /login/
'login_app' is not a registered namespace

这个命名空间是否应该在项目url文件中注册?

2 个答案:

答案 0 :(得分:1)

您根本没有使用“应用程序网址”。您已在项目URL中完全定义了URL(login),因此未创建namespace。通常您会使用include链接到应用网址,但您不会这样做。

答案 1 :(得分:0)

右键! 所以正确的方法是:

<强> HTML

<li><a id="toggleLogin" href= "{% url 'login_app:user_login' %}" onclick="toggleLogin();"

项目网址

url(r'^login/',include('login_app.urls',namespace='login_app')),

和应用网址

url(r'^$',views.user_login,name='user_login'), 

虽然它导致了关于内联javascript函数执行的另一个问题。但我会为此创建一个新问题。 感谢。