Search code examples
pythondjangoauthenticationdjango-urlsuser-registration

Django registration is not working


I am trying to add a user registration page but its showing

NoReverseMatch at /register/

Here is my project urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('pages.urls')),
    path('accounts/', include('django.contrib.auth.urls')),
    path('admin/', admin.site.urls),
]

Pages urls.py

from django.urls import path
from .views import *

from django.contrib.auth import views

app_name = 'pages'
urlpatterns = [
    path('', home_view, name='home'),
    path('register/', register_user, name='register'),
]

Pages views.py

def home_view(request, *args, **kwargs):
    return render(request, 'home.html', {})

def register_user(request, *args, **kwargs):
    if request.method=='POST':
        form = UserCreationForm(request.POST)

        if form.is_valid():
            form.save()
            username = form.cleaned_data['username']
            password = form.cleaned_data['password1']
            user = authenticate(username=username, password=password)
            login(request, user)
            return redirect('home')

    else:
        form = UserCreationForm()

    context = {'form': form}
    return render(request, 'register.html', context)

register.html

<!DOCTYPE html>
<html>
<head>
    <title>Register</title>
</head>
<h2>Register here</h2>
<body>
    <form method="post" action="{% url 'register' %}">
        {% csrf_token %}

        {% if form.errors %}
        <p>Invalid details</p>
        {% endif %}

        {{ form }}

        <input type="submit" value="Register">
    </form>
</body>
</html>

All is fine but still it's showing error

NoReverseMatch at /register/
Reverse for 'register' not found. 'register' is not a valid view function or pattern name.

Solution

  • In the urls.py file, you specified a namespace:

    from django.urls import path
    from .views import *
    
    from django.contrib.auth import views
    
    app_name = 'pages'
    
    urlpatterns = [
        path('', home_view, name='home'),
        path('register/', register_user, name='register'),
    ]

    This means that in order to refer to such named view, you need to prefix it with the namespace. So that means in the template you need to write it like:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Register</title>
    </head>
    <h2>Register here</h2>
    <body>
        <form method="post" action="{% url 'pages:register' %}">
            {% csrf_token %}
    
            {% if form.errors %}
            <p>Invalid details</p>
            {% endif %}
    
            {{ form }}
    
            <input type="submit" value="Register">
        </form>
    </body>
    </html>

    Furthermore the redirect(..) should be rewritten the same way:

    def register_user(request, *args, **kwargs):
        if request.method=='POST':
            form = UserCreationForm(request.POST)
    
            if form.is_valid():
                form.save()
                username = form.cleaned_data['username']
                password = form.cleaned_data['password1']
                user = authenticate(username=username, password=password)
                login(request, user)
                return redirect('pages:home')
    
        else:
            form = UserCreationForm()
    
        context = {'form': form}
        return render(request, 'register.html', context)