NoReverseMatch at /password_reset_complete/ 'users' is not a registered namespace

Viewed 295

base urls.py:

from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views
from users import views as user_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('register/', user_views.register , name='register'),
    path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(template_name='users/logged_out.html'), name='logout'),
    path('password_reset/',
         auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'),
         name='password_reset'),
    path('password_reset/done/',
         auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'),
         name='password_reset_done'),
    path('password_reset_confirm/<uidb64>/<token>/',
         auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'),
         name='password_reset_confirm'),
    path('password_reset_complete/',
         auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'),
         name='password_reset_complete'),
    path('', include('learning_logs.urls')),
]

password_reset_confirm.html:

{% extends "learning_logs/base.html" %}
{% load bootstrap4 %}

{% block page_header %}
    <h2>Reset your password.</h2>
{% endblock page_header %}

{% block content %}
    <form method="post">
    {% csrf_token %}
    {%  bootstrap_form form %}
    <button type="submit" class="btn btn-primary">Submit</button>
  </form>

{% endblock content %}

password_reset_complete.html:

{% extends "learning_logs/base.html" %}

{% block content %}
    <p>Password changed </p>
    <a href="{% url 'login' %}">Sign in</a>
{% endblock content %}

I've tried to find the reference to namespace 'users' which the error is referring to. But I have no idea where is the source. I get this error whenever I fill in password_reset_confirm fields for resetting the password. Any ideas?

Traceback:

Traceback (most recent call last):
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\urls\base.py", line 72, in reverse
    extra, resolver = resolver.namespace_dict[ns]
KeyError: 'users'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\views\generic\base.py", line 158, in get
    context = self.get_context_data(**kwargs)
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\contrib\auth\views.py", line 326, in get_context_data
    context['login_url'] = resolve_url(settings.LOGIN_URL)
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\shortcuts.py", line 131, in resolve_url
    return reverse(to, args=args, kwargs=kwargs)
  File "C:\Users\Shebeli\desktop\jango\ll_env\lib\site-packages\django\urls\base.py", line 83, in reverse
    raise NoReverseMatch("%s is not a registered namespace" % key)
django.urls.exceptions.NoReverseMatch: 'users' is not a registered namespace
2 Answers

This solution generally may help here! It is better to define the templates directories DIRS list in settings.TEMPLATES

One of the common approaches is to have one inside each app with the below hierarchy:

testproject/
    testproject/
        settings.py
        urls.py
        ....
    users/
        models.py
        views.py
        ....
        templates/
            users/
                password_reset.html
                ....
    manage.py
    ....

Then, mention the templates DIRs explicitly at settings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            'users/templates'
        ],
        ....
    }
]

This will avoid Django confusion. Now, you can add template_name as you mentioned above like: template_name='users/password_reset.html'

in settings.py I had: LOGIN_URL = 'users:login which should have been LOGIN_URL = 'login'

Related