I'm trying to implement a login functionality to a small Django project but when I go to the page with signup/signin form I get the 404 error. I am using Django default user model and auth forms.
here are the views:
def signup(request):
if request.user.is_authenticated:
return redirect('/')
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=password)
login(request, user)
return redirect('/')
else:
return render(request, 'signup.html', {'form': form})
else:
form = UserCreationForm()
return render(request, 'signup.html', {'form': form})
def signin(request):
if request.user.is_authenticated:
return render(request, 'homepage.html')
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('/')
else:
form = AuthenticationForm(request.POST)
return render(request, 'signin.html', {'form': form})
else:
form = AuthenticationForm()
return render(request, 'signin.html', {'form': form})
def log_out(request):
logout(request)
return redirect('/')
here are the urls for my views:
urlpatterns = [
path('', views.PostList.as_view(), name='home'),
path('<slug:slug>/', views.post_detail, name='post_detail'),
path('signup/', views.signup, name='register'),
path('signin/', views.signin, name='signup'),
path('log_out/', views.log_out, name='log_out'),
]
project urls:
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog_backend.urls'))
]
full error message:
Page not found (404)
Request Method: GET
Request URL: http://127.0.0.1:8000/signin/
Raised by: blog_backend.views.post_detail
No Post matches the given query.
You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
You have the URL pattern for
post_detail
above thesignup
pattern, sosignup/
is being handled by thepost_detail
view.The
post_detail
view tries to find a post withslug='signup'
, and gives a 404 error because it doesn't exist.You can fix the problem by changing the
post_detail
URL so that it doesn't matchsignup
, for example:Or switch the order of your URL patterns, so that the authentication URLs match first: