Django 异常类型:DoesNotExist |配置文件匹配查询不存在

Django 异常类型:DoesNotExist |配置文件匹配查询不存在,django,django-models,django-rest-framework,django-views,Django,Django Models,Django Rest Framework,Django Views,我试图在URL模式中获取用户名,而不是id,因此在注销函数中获取错误:配置文件匹配查询不存在。但是概要文件模板正在呈现所有查询,不会出现任何错误。如果我在URL中使用id,一切都正常!请向我建议如何消除这个错误。谢谢大家! 视图.py def logout_view(request): logout(request) return redirect("index") @login_required def profile(request, username

我试图在URL模式中获取用户名,而不是id
,因此在注销函数中获取错误:配置文件匹配查询不存在。但是概要文件模板正在呈现所有查询,不会出现任何错误。如果我在URL中使用id,一切都正常!请向我建议如何消除这个错误。谢谢大家!

视图.py

def logout_view(request):
    logout(request)
    return redirect("index")


@login_required
def profile(request, username):
    title = 'Profile'
    context={'title': title}
    profile = Profile.objects.get(username=username)
    if profile:
        context.update(profile = profile)
    else:
        return HttpResponse("user is not found")
    return render(request, 'UserApp/profile.html', context)
from django.urls import path
from UserApp import views

app_name = 'UserApp'

urlpatterns = [
    path('<str:username>/', views.profile, name='profile'),
    path('signup/', views.signup, name='signup'),
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
    path('update/', views.update_profile, name='update'),
]
url.py

def logout_view(request):
    logout(request)
    return redirect("index")


@login_required
def profile(request, username):
    title = 'Profile'
    context={'title': title}
    profile = Profile.objects.get(username=username)
    if profile:
        context.update(profile = profile)
    else:
        return HttpResponse("user is not found")
    return render(request, 'UserApp/profile.html', context)
from django.urls import path
from UserApp import views

app_name = 'UserApp'

urlpatterns = [
    path('<str:username>/', views.profile, name='profile'),
    path('signup/', views.signup, name='signup'),
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
    path('update/', views.update_profile, name='update'),
]
终端错误

  File "C:\Users\SONJOY\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\SONJOY\AppData\Local\Programs\Python\Python39\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "D:\TrackingSystem\UserApp\views.py", line 49, in profile
    profile = Profile.objects.get(username=username)
  File "C:\Users\SONJOY\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\SONJOY\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\query.py", line 429, in get
    raise self.model.DoesNotExist(
UserApp.models.Profile.DoesNotExist: Profile matching query does not exist.
[15/Apr/2021 09:52:47] "GET /user/logout/ HTTP/1.1" 500 77227

如果您访问
/logout
url,它将与
配置文件
视图匹配,因为这是第一个匹配的url模式。您应该将其放在最后,以便首先匹配
注册
登录
注销
等视图,并且只有当这些视图失败时,您才会“触发”配置文件视图,因此:

from django.urls import path
from UserApp import views

app_name = 'UserApp'

urlpatterns = [
    path('signup/', views.signup, name='signup'),
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
    path('update/', views.update_profile, name='update'),    
    # put this last ↓
    path('<str:username>/', views.profile, name='profile'),
]
从django.url导入路径
从UserApp导入视图
应用程序名称='UserApp'
URL模式=[
路径('signup/',views.signup,name='signup'),
路径('login/',views.login_view,name='login'),
路径('logout/',views.logout_view,name='logout'),
路径('update/',views.update_profile,name='update'),
#把这个放在最后&向下箭头;
路径(“/”,views.profile,name='profile'),

]
最好在url模式中添加前缀或后缀:
user/
。这将使您的URL信息量更大,防止此类情况发生,通常效果更好。感谢您的帮助,并对延迟表示歉意。你的解决方案很有效,我还没有遇到任何问题。。遵循这个技巧。你能确认profile.username的值吗?还有L49视图中用户名的值,在profile()中,我修复了这个问题,上面的答案帮助我解决了所有问题