django - “帖子匹配查询不存在。” 在 django 中导航到“管理页面”时出错?
问题描述
我正在学习 Django 并致力于制作一个简单的博客网站。现在整个项目工作正常,但是每当我导航到管理面板时,它都会显示错误“帖子匹配查询不存在。”。
让我知道您想查看代码的哪一部分(我很困惑哪个文件有错误)
错误 :
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/admin
Django Version: 2.0.5
Python Version: 3.6.5
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'posts']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site-
packages\django\core\handlers\exception.py" in inner
35. response = get_response(request)
File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site-
packages\django\core\handlers\base.py" in _get_response
128. response = self.process_exception_by_middleware(e,
request)
File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site-
packages\django\core\handlers\base.py" in _get_response
126. response = wrapped_callback(request, *callback_args,
**callback_kwargs)
File "C:\Users\Fruity_Dude\Projects\Django\devflow\posts\views.py" in
post_details
10. posts = Posts.objects.get(slug=slug)
File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site-
packages\django\db\models\manager.py" in manager_method
82. return getattr(self.get_queryset(), name)(*args,
**kwargs)
File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site-
packages\django\db\models\query.py" in get
403. self.model._meta.object_name
Exception Type: DoesNotExist at /admin
Exception Value: Posts matching query does not exist.
网址.py:
from django.urls import path
from . import views
app_name = 'posts'
urlpatterns = [
path('', views.posts, name='home'),
path('<slug:slug>', views.post_details, name='detail'),
]
视图.py:
from django.shortcuts import render
from .models import Posts
from django.http import HttpResponse
def posts(request):
posts = Posts.objects.all().order_by('date')
return render(request, 'posts/posts.html', {'posts': posts})
def post_details(request, slug):
posts = Posts.objects.get(slug=slug)
return render(request, 'posts/post_details.html', {'posts': posts})
主要urls.py:
from django.contrib import admin
from django.urls import path,include
from . import views
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls), #for admin
path('', include('posts.urls')),
path('about/', views.about, name='about'), #for about
path('contact/', views.contact, name='contact'), #for contact
path('support/', views.support, name='support'), #for support
path('donate/', views.donate, name='donate') #for donate
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
解决方案
问题似乎是你正在运行
posts = Posts.objects.get(slug=slug)
和你的网址捕获
path('<slug:slug>', views.post_details, name='detail')
例如,当您执行http://domain:port/a-post/
参数匹配的slug
操作时'a-post/'
(注意尾随/
)
你在评论中写道
url(r'^(?P<slug>[\w-]+)/$', views.post_details, name='detail')
解决了这个问题。这可能是因为尾随/
现在不包含在结果slug
变量中。
Posts.objects.get(slug=slug)
由于.get
- 方法需要匹配一行且只有一行,因此引发了错误。(见 django 文档)
为避免该问题,我看到您应该实施两种解决方案。
- 将匹配更改为
path('<slug:slug>/', views.post_details, name='detail')
,即添加一个/
. - 使用过滤器方法。
例如:
posts = Posts.objects.filter(slug=slug).all() # all() to make django perform the sql select command and return list
if not posts:
# handle error case, either return 404 or redirect somewhere.
elif len(posts) > 1:
# handle the weird case when there was more than one matching post
post = posts[0]
# render using post instead of posts, since it is only one post
推荐阅读
- javascript - 如何在 JavaScript 的 OnChange() 事件中使用 If Else?
- python - 同一组中观察的“向前填充”虚拟变量(Python)
- asp.net - 我应该为我的 ASP.NET Core 应用程序使用哪种类型的授权?
- dafny - 了解 Dafny 中的 :fuel 属性
- php - php while循环中的引导列不起作用
- javascript - 为什么单击我的浏览器正文后我的下拉菜单没有消失?
- stripe-payments - 如何获取与 Stripe 中的费用关联的价格 ID?
- reactjs - 如何使用打字稿反应使数据表中的自动增量编号列发生反应?
- c# - 我是否必须在 Visual Studio 中连接 SQL Server 数据库才能在 C# 项目中使用它?
- javascript - 在 V8 中集成 seb API(setTimeout、fetch 等)的最佳方式是什么