问题描述
我正在尝试为一个小型Django项目实现登录功能,但是当我以注册/登录形式进入页面时,出现404错误。我正在使用Django默认用户模型和身份验证表单。
以下是视图:
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,{'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,{'form': form})
def log_out(request):
logout(request)
return redirect('/')
以下是我的观点的网址:
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'),]
项目网址:
urlpatterns = [
path('admin/',admin.site.urls),path('',include('blog_backend.urls'))
]
完整的错误消息:
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.
解决方法
path('<slug:slug>/',views.post_detail,name='post_detail'),path('signup/',views.signup,name='register'),
您在post_detail
模式上方有signup
的URL模式,因此signup/
视图正在处理post_detail
。
post_detail
视图尝试查找带有slug='signup'
的帖子,并给出404错误,因为它不存在。
您可以通过更改post_detail
URL使其与signup
不匹配来解决此问题,例如:
path('blog/<slug:slug>/',
或切换您的URL模式的顺序,以使身份验证URL首先匹配:
path('signup/',path('signin/',views.signin,name='signup'),path('log_out/',views.log_out,name='log_out'),path('<slug:slug>/',