尝试向Django注册用户时,为什么不能访问模板视图?

问题描述

我正在尝试为一个小型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>/',